# clean up R environment
rm(list = ls())
library(dplyr)
library(tidyr)
library(stringr)
library(mosaic)
library(plyr)
library(ggplot2)
library(rvest)
library(reshape2)
library(readxl)
library(rpart)
library(partykit)
library(mclust)
library(tibble)
library(readr)
library(viridis)
library(RColorBrewer)
library(maps)
library(maptools)
library(mapdata)
library(ggthemes)
library(cluster)
library(fpca)
library(doParallel)
#using multiple cores
myCluster <- makeCluster(detectCores() - 1, type = "FORK")
# options
# display as decimal, not scientific notation
options(scipen = 999)
# data for 2013 - 2016
county_poverty <- read.csv(file = 'county_poverty_hist.csv', header = TRUE, sep = ',')
county_poverty$geo_sumlevel <- gsub('[[:punct:]]\\s', '', str_extract(county_poverty$geo_name, '\\,\\s[A-Z]{2}'))
county_poverty$geo_name <- gsub('\\,\\s[A-Z]{2}', '', county_poverty$geo_name)
county_poverty <- county_poverty[-3]
# naming scheme:
# pYEAR = number of people in poverty, for the given year
# prYEAR = poverty rate, for the given year
# popYEAR = total population, for the given year
names(county_poverty) <- c('county', 'state',
'p2013', 'p2014', 'p2015',
'pr2013', 'pr2014', 'pr2015',
'pr2016', 'p2016', 'pop2013',
'pop2014', 'pop2015', 'pop2016')
county_poverty <- county_poverty %>%
na.omit() %>%
select(sort(current_vars()))
# remove Puerto Rico
county_poverty <- county_poverty %>%
filter(state != 'PR')
county_poverty <- county_poverty %>%
select(sort(current_vars()))
# economic/unemployment data
# https://apps.bea.gov/regional/
ec <- read.csv('CAINC4__ALL_STATES_1969_2017.csv', header = TRUE, sep = ',')
ec <- ec[, c('GeoFIPS', 'GeoName', 'Description', 'X2013', 'X2014', 'X2015', 'X2016')]
ec$Description <- gsub('[[:punct:]]', '', ec$Description) %>%
trimws()
# keep 'Per capita personal income (dollars) 4/', 'Total employment', 'Farm proprietors' income', 'Nonfarm proprietors' income'
# clean data
ec <- ec %>%
filter(ec$Description == 'Per capita personal income dollars 4' |
ec$Description == 'Total employment' |
ec$Description == 'Farm proprietors income' |
ec$Description == 'Nonfarm proprietors income')
ec$Description[ec$Description == 'Per capita personal income dollars 4'] <- 'income'
ec$Description[ec$Description == 'Total employment'] <- 'empl_count'
ec$Description[ec$Description == 'Farm proprietors income'] <- 'farm_income'
ec$Description[ec$Description == 'Nonfarm proprietors income'] <- 'nonfarm_income'
ec <- dcast(melt(ec,
id.vars = c('GeoFIPS', 'GeoName', 'Description'),
measure.vars = c('X2013', 'X2014', 'X2015', 'X2016')),
GeoFIPS + GeoName + variable ~ Description) %>%
mutate(variable = gsub('X', '', variable))
attributes are not identical across measure variables; they will be dropped
ec[, 1:2] <- lapply(ec[, 1:2], as.character)
ec[, c(1, 3:7)] <- lapply(ec[, c(1, 3:7)], as.numeric)
NAs introduced by coercionNAs introduced by coercionNAs introduced by coercionNAs introduced by coercion
ec$p_farm_income <- ec$farm_income / ec$nonfarm_income
ec[is.na(ec)] <- 0
# combine economic data with land area
area <- read_excel('LND01.xls')[,c(2,4)]
names(area) <- c('GeoFIPS', 'area')
area <- lapply(area, as.numeric)
ec <- merge(ec, area, by = 'GeoFIPS')
# state data
## COMBINE WITH 'STATE_DATA' DATA FRAME
state_ec <- ec[(ec$GeoFIPS %% 1000 == 0), ]
state_ec <- state_ec %>%
filter(GeoFIPS < 90000 & GeoFIPS != 0)
state_ec <- subset(state_ec, select = -c(GeoFIPS))
names(state_ec) <- c('state', 'year',
'empl_count', 'farm_income',
'income', 'nonfarm_income',
'p_farm_income', 'area')
# create tall data set
cp1 <- gather(county_poverty[c(1:5, 14)], year, poverty_count, p2013:p2016, factor_key = TRUE) %>%
mutate(year = str_extract(year, '\\d{4}'))
cp2 <- gather(county_poverty[c(1, 6:9, 14)], year, total_count, pop2013:pop2016, factor_key = TRUE) %>%
mutate(year = str_extract(year, '\\d{4}'))
cp <- merge(cp1, cp2, by = c('county', 'state', 'year')) %>%
mutate(poverty_rate = poverty_count / total_count,
year = year %>% as.numeric())
cp$county <- gsub('\\sCounty', '', cp$county)
cp$county <- gsub('\\sParish', '', cp$county)
cp$county <- gsub('\\scity', '\\sCity', cp$county)
cp$county <- gsub('[[:punct:]]', '', cp$county)
cp$county <- cp$county %>%
trimws()
# county data
county_ec <- ec[!(ec$GeoFIPS %% 1000 == 0), ]
county_ec <- subset(county_ec, select = -c(GeoFIPS))
county_ec$state <- gsub('[[:punct:]]\\s', '', str_extract(county_ec$GeoName, '\\,\\s[A-Z]{2}'))
county_ec$GeoName <- gsub('\\,\\s[A-Z]{2}', '', county_ec$GeoName)
names(county_ec) <- c('county', 'year', 'empl_count',
'farm_income', 'income', 'nonfarm_income',
'p_farm_income', 'area', 'state')
county_ec$county <- gsub('[[:punct:]]', '', county_ec$county)
county_ec$county <- gsub('\\sIndependent\\sCity', '\\sCity', county_ec$county)
county_ec$county <- gsub('\\sStaunton\\sWaynesboro', '', county_ec$county)
# manual fix for counties with area = 0
# scrape areas from Wikipedia, as Census data was inadequate
zeroarea <- county_ec[which(county_ec$area == 0), -c(2:7)] %>%
unique()
zeroarea$wiki_link <- gsub(' City and Borough', '', zeroarea$county)
zeroarea$wiki_link <- gsub(' Municipality', '', zeroarea$wiki_link)
zeroarea$wiki_link <- gsub('[A-Z]{2}', '',
paste('https://en.wikipedia.org/wiki/',
gsub('\\s', '_', zeroarea$wiki_link), ',_',
gsub('AK', 'Alaska', zeroarea$state),
gsub('CO', 'Colorado', zeroarea$state),
sep = ''))
for(i in 1:nrow(zeroarea)) {
zeroarea$area[i] <- gsub(',', '', read_html(zeroarea$wiki_link[i]) %>%
html_nodes(xpath = '//th[contains(., "Area")]//parent::tr/following-sibling::tr[1]/td') %>%
html_text() %>%
str_extract('[\\d\\.,]+'))[1] %>%
as.numeric()
county_ec$area[which(county_ec$county == zeroarea$county[i])] <- zeroarea$area[which(zeroarea$county == zeroarea$county[i])]
}
county_data <- merge(cp, county_ec,
by = c('county', 'state', 'year')) %>%
mutate(empl_rate = empl_count / total_count,
pop_dens = total_count / area)
# 'county_data' to wide
st <- list()
for (i in 2013:2016) {
df <- county_data %>%
filter(year == i)
df <- df[, -3]
df_names <- names(df)
df_names[3] <- paste('p', i %>% as.character(), sep = '')
df_names[4] <- paste('pop', i %>% as.character(), sep = '')
df_names[5] <- paste('pr', i %>% as.character(), sep = '')
df_names[6] <- paste('ec', i %>% as.character(), sep = '')
df_names[7] <- paste('f_inc', i %>% as.character(), sep = '')
df_names[8] <- paste('inc', i %>% as.character(), sep = '')
df_names[9] <- paste('nf_inc', i %>% as.character(), sep = '')
df_names[10] <- paste('pf_inc', i %>% as.character(), sep = '')
df_names[12] <- paste('er', i %>% as.character(), sep = '')
df_names[13] <- paste('pop_dens', i %>% as.character(), sep = '')
names(df) <- df_names
st[[i - 2012]] <- df
}
county_data_wide <- merge(st[[1]], st[[2]],
by = c('state', 'county', 'area'))
county_data_wide <- merge(county_data_wide, st[[3]],
by = c('state', 'county', 'area'))
county_data_wide <- merge(county_data_wide, st[[4]],
by = c('state', 'county', 'area'))
# data set of poverty, by state
state_poverty <- table(county_data_wide$state) %>%
data.frame()
names(state_poverty) <- c('state', 'n_counties')
# 51 = number of states, including Washington D.C.
# create a data table of summary stats per state
sp <- list()
for(i in 1:51) {
state_stats <- data.frame(summary(county_data_wide[which(county_data_wide$state == state_poverty$state[i]), ]))[13:258, 2:3] %>%
mutate(stat = gsub('\\s*\\:', '',
str_extract(Freq, '.*\\:')),
Freq = gsub(':', '',
str_extract(Freq, '\\:.+')) %>%
as.numeric()) %>%
reshape(idvar = 'Var2', timevar = 'stat', direction = 'wide') %>%
mutate(Year = str_extract(Var2, '\\d{4}'),
Var2 = str_extract(Var2, '[a-z_]{1,7}'),
state = state_poverty$state[i])
sp[[i]] <- state_stats
}
# clean data, rename variables and reorganize column order
state_poverty <- merge(state_poverty, do.call(rbind, sp), by = 'state') %>%
select(sort(current_vars()))
state_poverty <- state_poverty[, c(8, 10, 7, 9, 1:6)]
state_poverty$Var2[state_poverty$Var2 == 'p'] <- 'poverty_count'
state_poverty$Var2[state_poverty$Var2 == 'pr'] <- 'poverty_rate'
state_poverty$Var2[state_poverty$Var2 == 'pop'] <- 'total_count'
state_poverty$Var2[state_poverty$Var2 == 'ec'] <- 'empl_count'
state_poverty$Var2[state_poverty$Var2 == 'f_inc'] <- 'farm_income'
state_poverty$Var2[state_poverty$Var2 == 'inc'] <- 'income'
state_poverty$Var2[state_poverty$Var2 == 'f_inc'] <- 'farm_income'
state_poverty$Var2[state_poverty$Var2 == 'nf_inc'] <- 'nonfarm_income'
state_poverty$Var2[state_poverty$Var2 == 'pf_inc'] <- 'p_farm_income'
state_poverty$Var2[state_poverty$Var2 == 'er'] <- 'empl_rate'
state_poverty$Var2[state_poverty$Var2 == 'area'] <- 'area'
state_poverty$Var2[state_poverty$Var2 == 'pop_den'] <- 'pop_dens'
names(state_poverty) <- c('state', 'year', 'n_counties', 'countystat', '1st_quantile', '3rd_quantile', 'max', 'mean', 'median', 'minimum')
# replace NAs for 'year'
for(i in 1:nrow(state_poverty)) {
if(state_poverty$year[i] %>% is.na) {
state_poverty$year[i] <- state_poverty$year[i + 1]
}
}
# create variables measuring the standard deviation and variance of county stats, per year
state_variance <- c()
state_sd <- c()
for(i in 1:nrow(state_poverty)) {
state_variance[i] <- county_data %>%
filter(state == state_poverty$state[i] & year == state_poverty$year[i]) %>%
select(state_poverty$countystat[i]) %>%
var()
state_sd[i] <- sapply(county_data %>%
filter(state == state_poverty$state[i] & year == state_poverty$year[i]) %>%
select(state_poverty$countystat[i]),
sd)[[1]][1]
}
state_poverty$var <- state_variance
state_poverty$sd <- state_sd
state_poverty[is.na(state_poverty)] <- 0
# merge state stats with statistics on total state population ('state_ec'), total state poverty count, and overall state poverty rate (aggregating 'cp')
# change 'state_ec' names from full words to 2-letter abbreviations
for(i in 1:nrow(state_ec)) {
if(state_ec$state[i] == 'District of Columbia') {
state_ec$state[i] <- 'DC'
} else {
state_ec$state[i] <- state.abb[grep(state_ec$state[i], state.name)]
}
}
number of items to replace is not a multiple of replacement lengthnumber of items to replace is not a multiple of replacement lengthnumber of items to replace is not a multiple of replacement lengthnumber of items to replace is not a multiple of replacement length
state_ec <- merge(state_ec,
merge(aggregate(poverty_count ~ state + year, cp, sum),
aggregate(total_count ~ state + year, cp, sum),
by = c('state', 'year')),
by = c('state', 'year')) %>%
mutate(poverty_rate = poverty_count / total_count,
empl_rate = empl_count / total_count)
state_ec <- merge(state_poverty, state_ec, by = c('state', 'year'))
# rename state-wide variables for clarity
names(state_ec) <- c('state', 'year', 'n_counties',
'countystat', '1st_quantile', '3rd_quantile',
'max', 'mean', 'median',
'minimum', 'var', 'sd',
'state_empl_count', 'state_farm_income', 'state_avg_income',
'state_nonfarm_income', 'state_p_farm_income', 'state_area',
'state_poverty_count', 'state_total_count', 'state_poverty_rate',
'state_empl_rate')
# per-state crime data, merge with 'state_data'
state_crime <- read.csv(file = 'estimated_crimes.csv', header = TRUE, sep = ',')
state_data <- merge(state_ec, state_crime[, -c(2, 4:5, 15)],
by.x = c('year', 'state'), by.y = c('year', 'state_abbr')) %>%
mutate(state_vcrime_rate = violent_crime / state_total_count,
state_pcrime_rate = property_crime / state_total_count,
state_pop_dens = state_total_count / state_area)
state_data <- state_data[, c(1:3, 20, 18, 34, 15, 4:12, 17, 13, 22, 19, 21, 23, 32, 28, 33)]
state_data$year <- state_data$year %>% as.numeric()
# explain 'state_data' variables below
# year: 2013-2016
# state: state, within the United States
# n_counties: number of counties in this state
# state_total_count: state population
# countystat: type of statistic, measured within counties of each state
## empl_count: number of employed individuals working per county
## farm_income: amount of income from farming per county
## nonfarm_income: amount of income from non-farming industries per county
## p_farm_income: ratio of 'farm_income' to 'nonfarm_income' per county, can be negative, indicator of how rural counties are
## empl_rate: ratio of employed individuals working per county, can be >1
## poverty_rate: percentage of individuals in poverty per county
## poverty_count: number of individuals in poverty per county
## total_count: population per county
# 1st_quantile:sd: statistics on counties, per state and year
# state_avg_income: average income per individual per state and year
# state_p_farm_income: ratio of 'farm_income' to 'nonfarm_income' per state and year, can be negative, indicator of how rural counties are
# state_poverty_count: number of individuals in poverty per state and year
# state_poverty_rate: percentage of individuals in poverty per state and year
# state_empl_count: number of employed individuals working per state and year
# state_empl_rate: ratio of employed individuals working per state and year
# violent_crime: number of violent crimes per state and year
# state_vcrime_rate: rate of violent crimes per state and year
# property_crime: number of property crimes per state and year
# state_pcrime_rate: rate of property crimes per state and year
# save 'state_data' as .csv file
write.csv(state_data, file = 'state_data.csv')
# various regressions
lm(state_vcrime_rate ~ state + year + var,
data = state_data %>% filter(countystat == 'poverty_rate')) %>%
msummary()
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.16600898 0.02987540 -5.557 0.000000121172815565 ***
stateAL -0.00256400 0.00016705 -15.349 < 0.0000000000000002 ***
stateAR -0.00185904 0.00020580 -9.033 0.000000000000000738 ***
stateAZ -0.00282847 0.00017330 -16.321 < 0.0000000000000002 ***
stateCA -0.00280151 0.00019896 -14.081 < 0.0000000000000002 ***
stateCO -0.00389012 0.00017447 -22.297 < 0.0000000000000002 ***
stateCT -0.00434224 0.00032718 -13.272 < 0.0000000000000002 ***
stateDC 0.00709309 0.00037155 19.090 < 0.0000000000000002 ***
stateDE -0.00146553 0.00036157 -4.053 0.000080609750724398 ***
stateFL -0.00233992 0.00020156 -11.609 < 0.0000000000000002 ***
stateGA -0.00348890 0.00018308 -19.056 < 0.0000000000000002 ***
stateHI -0.00444839 0.00020108 -22.123 < 0.0000000000000002 ***
stateIA -0.00396951 0.00029232 -13.579 < 0.0000000000000002 ***
stateID -0.00478225 0.00022306 -21.440 < 0.0000000000000002 ***
stateIL -0.00296354 0.00022463 -13.193 < 0.0000000000000002 ***
stateIN -0.00304924 0.00025604 -11.909 < 0.0000000000000002 ***
stateKS -0.00313147 0.00024636 -12.711 < 0.0000000000000002 ***
stateKY -0.00520906 0.00018352 -28.384 < 0.0000000000000002 ***
stateLA -0.00191695 0.00017918 -10.699 < 0.0000000000000002 ***
stateMA -0.00281371 0.00026630 -10.566 < 0.0000000000000002 ***
stateMD -0.00233531 0.00018345 -12.730 < 0.0000000000000002 ***
stateME -0.00553603 0.00030059 -18.417 < 0.0000000000000002 ***
stateMI -0.00248043 0.00024486 -10.130 < 0.0000000000000002 ***
stateMN -0.00444102 0.00028297 -15.694 < 0.0000000000000002 ***
stateMO -0.00219310 0.00020779 -10.555 < 0.0000000000000002 ***
stateMS -0.00474653 0.00021443 -22.135 < 0.0000000000000002 ***
stateMT -0.00375591 0.00017411 -21.572 < 0.0000000000000002 ***
stateNC -0.00346685 0.00020981 -16.524 < 0.0000000000000002 ***
stateND -0.00459135 0.00017237 -26.637 < 0.0000000000000002 ***
stateNE -0.00403924 0.00026724 -15.115 < 0.0000000000000002 ***
stateNH -0.00463935 0.00033665 -13.781 < 0.0000000000000002 ***
stateNJ -0.00434025 0.00023178 -18.725 < 0.0000000000000002 ***
stateNM -0.00078217 0.00016708 -4.681 0.000006292790458193 ***
stateNV -0.00010532 0.00026927 -0.391 0.69625
stateNY -0.00301692 0.00025059 -12.039 < 0.0000000000000002 ***
stateOH -0.00400565 0.00022659 -17.678 < 0.0000000000000002 ***
stateOK -0.00250750 0.00022000 -11.398 < 0.0000000000000002 ***
stateOR -0.00418656 0.00028998 -14.437 < 0.0000000000000002 ***
statePA -0.00356266 0.00029106 -12.240 < 0.0000000000000002 ***
stateRI -0.00448894 0.00024850 -18.064 < 0.0000000000000002 ***
stateSC -0.00183783 0.00019820 -9.273 < 0.0000000000000002 ***
stateSD -0.00445006 0.00053285 -8.351 0.000000000000040245 ***
stateTN -0.00062988 0.00023868 -2.639 0.00919 **
stateTX -0.00292348 0.00016753 -17.450 < 0.0000000000000002 ***
stateUT -0.00470278 0.00019850 -23.692 < 0.0000000000000002 ***
stateVA -0.00509680 0.00017780 -28.666 < 0.0000000000000002 ***
stateVT -0.00553576 0.00032929 -16.811 < 0.0000000000000002 ***
stateWA -0.00399023 0.00023101 -17.273 < 0.0000000000000002 ***
stateWI -0.00389852 0.00026240 -14.857 < 0.0000000000000002 ***
stateWV -0.00362839 0.00022946 -15.812 < 0.0000000000000002 ***
stateWY -0.00481323 0.00021980 -21.898 < 0.0000000000000002 ***
year 0.00008573 0.00001484 5.775 0.000000042337838656 ***
var 0.17040076 0.08546137 1.994 0.04796 *
Residual standard error: 0.0002361 on 151 degrees of freedom
Multiple R-squared: 0.9892, Adjusted R-squared: 0.9855
F-statistic: 267.2 on 52 and 151 DF, p-value: < 0.00000000000000022
lm(state_vcrime_rate ~ state + year + var,
data = state_data %>% filter(countystat == 'pop_dens')) %>%
msummary()
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.1827872107075 0.0303324801240 -6.026 0.00000001231859 ***
stateAL -0.0025493182041 0.0001668002380 -15.284 < 0.0000000000000002 ***
stateAR -0.0020979024549 0.0001667972137 -12.578 < 0.0000000000000002 ***
stateAZ -0.0029184502459 0.0001668019413 -17.497 < 0.0000000000000002 ***
stateCA -0.0028741075426 0.0001807304400 -15.903 < 0.0000000000000002 ***
stateCO -0.0039084943962 0.0001715695923 -22.781 < 0.0000000000000002 ***
stateCT -0.0048580721635 0.0001682370770 -28.876 < 0.0000000000000002 ***
stateDC 0.0064310304350 0.0001667963389 38.556 < 0.0000000000000002 ***
stateDE -0.0020356735023 0.0001701650369 -11.963 < 0.0000000000000002 ***
stateFL -0.0025321098431 0.0001675660907 -15.111 < 0.0000000000000002 ***
stateGA -0.0033014425537 0.0001677913113 -19.676 < 0.0000000000000002 ***
stateHI -0.0046580265936 0.0001669320526 -27.904 < 0.0000000000000002 ***
stateIA -0.0044460794373 0.0001667988342 -26.655 < 0.0000000000000002 ***
stateID -0.0050759510004 0.0001667974490 -30.432 < 0.0000000000000002 ***
stateIL -0.0032158361676 0.0001683788492 -19.099 < 0.0000000000000002 ***
stateIN -0.0034169488730 0.0001670618208 -20.453 < 0.0000000000000002 ***
stateKS -0.0034863016927 0.0001668255622 -20.898 < 0.0000000000000002 ***
stateKY -0.0050451230154 0.0001668970430 -30.229 < 0.0000000000000002 ***
stateLA -0.0017758906576 0.0001668862211 -10.641 < 0.0000000000000002 ***
stateMA -0.0026129656517 0.0003419663795 -7.641 0.00000000000231 ***
stateMD -0.0020062377339 0.0002870198856 -6.990 0.00000000008269 ***
stateME -0.0060332541499 0.0001667973205 -36.171 < 0.0000000000000002 ***
stateMI -0.0028024760819 0.0001676667651 -16.715 < 0.0000000000000002 ***
stateMN -0.0048562286115 0.0001679446942 -28.916 < 0.0000000000000002 ***
stateMO -0.0023798550820 0.0001693199909 -14.055 < 0.0000000000000002 ***
stateMS -0.0044775551126 0.0001667965858 -26.844 < 0.0000000000000002 ***
stateMT -0.0038547370663 0.0001667963284 -23.110 < 0.0000000000000002 ***
stateNC -0.0037039233242 0.0001669848897 -22.181 < 0.0000000000000002 ***
stateND -0.0045058887798 0.0001667963239 -27.014 < 0.0000000000000002 ***
stateNE -0.0044474679715 0.0001668400463 -26.657 < 0.0000000000000002 ***
stateNH -0.0052165157168 0.0001668195873 -31.270 < 0.0000000000000002 ***
stateNJ -0.0029459452911 0.0008497418100 -3.467 0.000686 ***
stateNM -0.0007657653601 0.0001668009087 -4.591 0.00000922818479 ***
stateNV -0.0005257684625 0.0001667967761 -3.152 0.001955 **
stateNY 0.0112834420635 0.0071310049495 1.582 0.115672
stateOH -0.0042770322678 0.0001676181947 -25.517 < 0.0000000000000002 ***
stateOK -0.0027859216144 0.0001668337819 -16.699 < 0.0000000000000002 ***
stateOR -0.0046375660160 0.0001671314123 -27.748 < 0.0000000000000002 ***
statePA -0.0035689816481 0.0002824186807 -12.637 < 0.0000000000000002 ***
stateRI -0.0047882652724 0.0001700080362 -28.165 < 0.0000000000000002 ***
stateSC -0.0020469628469 0.0001668071027 -12.271 < 0.0000000000000002 ***
stateSD -0.0034410995171 0.0001667963070 -20.631 < 0.0000000000000002 ***
stateTN -0.0009597260154 0.0001668712505 -5.751 0.00000004759584 ***
stateTX -0.0029277776899 0.0001671974513 -17.511 < 0.0000000000000002 ***
stateUT -0.0048991442243 0.0001670196539 -29.333 < 0.0000000000000002 ***
stateVA -0.0046485052382 0.0003234171580 -14.373 < 0.0000000000000002 ***
stateVT -0.0061011334634 0.0001667965308 -36.578 < 0.0000000000000002 ***
stateWA -0.0042988167742 0.0001668642171 -25.762 < 0.0000000000000002 ***
stateWI -0.0042972375386 0.0001668136639 -25.761 < 0.0000000000000002 ***
stateWV -0.0039400637857 0.0001667998460 -23.622 < 0.0000000000000002 ***
stateWY -0.0050985128235 0.0001667963351 -30.567 < 0.0000000000000002 ***
year 0.0000943869796 0.0000150569724 6.269 0.00000000362896 ***
var -0.0000000002637 0.0000000001281 -2.058 0.041290 *
Residual standard error: 0.0002359 on 151 degrees of freedom
Multiple R-squared: 0.9893, Adjusted R-squared: 0.9856
F-statistic: 267.6 on 52 and 151 DF, p-value: < 0.00000000000000022
lm(state_vcrime_rate ~ state + year + mean,
data = state_data %>% filter(countystat == 'p_farm_income')) %>%
msummary()
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.12103252 0.03431532 -3.527 0.000557 ***
stateAL -0.00244393 0.00016927 -14.438 < 0.0000000000000002 ***
stateAR -0.00197214 0.00017094 -11.537 < 0.0000000000000002 ***
stateAZ -0.00289953 0.00016505 -17.568 < 0.0000000000000002 ***
stateCA -0.00294148 0.00016706 -17.607 < 0.0000000000000002 ***
stateCO -0.00393034 0.00016628 -23.636 < 0.0000000000000002 ***
stateCT -0.00490279 0.00016487 -29.738 < 0.0000000000000002 ***
stateDC 0.00643088 0.00016487 39.007 < 0.0000000000000002 ***
stateDE -0.00206329 0.00016553 -12.465 < 0.0000000000000002 ***
stateFL -0.00249554 0.00016672 -14.969 < 0.0000000000000002 ***
stateGA -0.00324939 0.00016792 -19.351 < 0.0000000000000002 ***
stateHI -0.00467270 0.00016487 -28.343 < 0.0000000000000002 ***
stateIA -0.00425524 0.00017857 -23.830 < 0.0000000000000002 ***
stateID -0.00487300 0.00018018 -27.046 < 0.0000000000000002 ***
stateIL -0.00314827 0.00016987 -18.534 < 0.0000000000000002 ***
stateIN -0.00335816 0.00016720 -20.085 < 0.0000000000000002 ***
stateKS -0.00327491 0.00018218 -17.976 < 0.0000000000000002 ***
stateKY -0.00500224 0.00016602 -30.131 < 0.0000000000000002 ***
stateLA -0.00173208 0.00016603 -10.433 < 0.0000000000000002 ***
stateMA -0.00322817 0.00016487 -19.581 < 0.0000000000000002 ***
stateMD -0.00245627 0.00016523 -14.866 < 0.0000000000000002 ***
stateME -0.00602590 0.00016489 -36.544 < 0.0000000000000002 ***
stateMI -0.00282840 0.00016490 -17.152 < 0.0000000000000002 ***
stateMN -0.00477015 0.00017090 -27.913 < 0.0000000000000002 ***
stateMO -0.00236022 0.00016728 -14.109 < 0.0000000000000002 ***
stateMS -0.00443108 0.00016572 -26.739 < 0.0000000000000002 ***
stateMT -0.00367647 0.00017663 -20.814 < 0.0000000000000002 ***
stateNC -0.00364337 0.00016712 -21.801 < 0.0000000000000002 ***
stateND -0.00436628 0.00017217 -25.360 < 0.0000000000000002 ***
stateNE -0.00386418 0.00026730 -14.456 < 0.0000000000000002 ***
stateNH -0.00522206 0.00016487 -31.675 < 0.0000000000000002 ***
stateNJ -0.00465974 0.00016487 -28.264 < 0.0000000000000002 ***
stateNM -0.00066467 0.00016894 -3.934 0.000127 ***
stateNV -0.00055989 0.00016529 -3.387 0.000900 ***
stateNY -0.00336834 0.00016504 -20.409 < 0.0000000000000002 ***
stateOH -0.00429453 0.00016497 -26.032 < 0.0000000000000002 ***
stateOK -0.00266827 0.00017076 -15.626 < 0.0000000000000002 ***
stateOR -0.00457832 0.00016737 -27.355 < 0.0000000000000002 ***
statePA -0.00402305 0.00016495 -24.389 < 0.0000000000000002 ***
stateRI -0.00485617 0.00016487 -29.455 < 0.0000000000000002 ***
stateSC -0.00203865 0.00016492 -12.361 < 0.0000000000000002 ***
stateSD -0.00303679 0.00021883 -13.877 < 0.0000000000000002 ***
stateTN -0.00096544 0.00016487 -5.856 0.0000000286 ***
stateTX -0.00284826 0.00016892 -16.862 < 0.0000000000000002 ***
stateUT -0.00480114 0.00016994 -28.253 < 0.0000000000000002 ***
stateVA -0.00520559 0.00016493 -31.562 < 0.0000000000000002 ***
stateVT -0.00607852 0.00016507 -36.824 < 0.0000000000000002 ***
stateWA -0.00424245 0.00016654 -25.474 < 0.0000000000000002 ***
stateWI -0.00425670 0.00016566 -25.696 < 0.0000000000000002 ***
stateWV -0.00394624 0.00016487 -23.935 < 0.0000000000000002 ***
stateWY -0.00507286 0.00016511 -30.723 < 0.0000000000000002 ***
year 0.00006373 0.00001703 3.741 0.000259 ***
mean -0.00020643 0.00007347 -2.810 0.005616 **
Residual standard error: 0.0002332 on 151 degrees of freedom
Multiple R-squared: 0.9895, Adjusted R-squared: 0.9859
F-statistic: 274 on 52 and 151 DF, p-value: < 0.00000000000000022
lm(state_vcrime_rate ~ state + year + var,
data = state_data %>% filter(countystat == 'empl_rate')) %>%
msummary()
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.16584128 0.03046629 -5.443 0.00000020690236819 ***
stateAL -0.00232649 0.00028211 -8.247 0.00000000000007374 ***
stateAR -0.00187305 0.00028276 -6.624 0.00000000057725935 ***
stateAZ -0.00269917 0.00027963 -9.653 < 0.0000000000000002 ***
stateCA -0.00281504 0.00026403 -10.662 < 0.0000000000000002 ***
stateCO -0.00383766 0.00022849 -16.796 < 0.0000000000000002 ***
stateCT -0.00467380 0.00028559 -16.365 < 0.0000000000000002 ***
stateDC 0.00668593 0.00030639 21.822 < 0.0000000000000002 ***
stateDE -0.00187060 0.00028960 -6.459 0.00000000136363296 ***
stateFL -0.00235305 0.00027167 -8.662 0.00000000000000661 ***
stateGA -0.00318462 0.00022905 -13.903 < 0.0000000000000002 ***
stateHI -0.00442819 0.00029723 -14.898 < 0.0000000000000002 ***
stateIA -0.00422026 0.00028415 -14.852 < 0.0000000000000002 ***
stateID -0.00520768 0.00021352 -24.390 < 0.0000000000000002 ***
stateIL -0.00304324 0.00027795 -10.949 < 0.0000000000000002 ***
stateIN -0.00322055 0.00027460 -11.728 < 0.0000000000000002 ***
stateKS -0.00328264 0.00027010 -12.153 < 0.0000000000000002 ***
stateKY -0.00485795 0.00026157 -18.572 < 0.0000000000000002 ***
stateLA -0.00160218 0.00025089 -6.386 0.00000000199158404 ***
stateMA -0.00307112 0.00023035 -13.332 < 0.0000000000000002 ***
stateMD -0.00226145 0.00028240 -8.008 0.00000000000028970 ***
stateME -0.00580699 0.00028394 -20.451 < 0.0000000000000002 ***
stateMI -0.00261719 0.00027827 -9.405 < 0.0000000000000002 ***
stateMN -0.00467744 0.00027726 -16.870 < 0.0000000000000002 ***
stateMO -0.00222256 0.00027575 -8.060 0.00000000000021527 ***
stateMS -0.00427042 0.00026828 -15.918 < 0.0000000000000002 ***
stateMT -0.00364065 0.00027312 -13.330 < 0.0000000000000002 ***
stateNC -0.00351146 0.00026909 -13.049 < 0.0000000000000002 ***
stateND -0.00435704 0.00022522 -19.345 < 0.0000000000000002 ***
stateNE -0.00422841 0.00028351 -14.914 < 0.0000000000000002 ***
stateNH -0.00499346 0.00028503 -17.519 < 0.0000000000000002 ***
stateNJ -0.00443768 0.00028050 -15.820 < 0.0000000000000002 ***
stateNM -0.00056434 0.00026533 -2.127 0.03505 *
stateNV -0.00122579 0.00072234 -1.697 0.09176 .
stateNY -0.00323640 0.00022823 -14.180 < 0.0000000000000002 ***
stateOH -0.00409035 0.00027859 -14.682 < 0.0000000000000002 ***
stateOK -0.00258715 0.00026694 -9.692 < 0.0000000000000002 ***
stateOR -0.00443097 0.00028468 -15.565 < 0.0000000000000002 ***
statePA -0.00382159 0.00027513 -13.890 < 0.0000000000000002 ***
stateRI -0.00461594 0.00029420 -15.690 < 0.0000000000000002 ***
stateSC -0.00183411 0.00027537 -6.660 0.00000000047726822 ***
stateSD -0.00324702 0.00025773 -12.598 < 0.0000000000000002 ***
stateTN -0.00075813 0.00027152 -2.792 0.00591 **
stateTX -0.00277209 0.00024685 -11.230 < 0.0000000000000002 ***
stateUT -0.00472267 0.00025786 -18.315 < 0.0000000000000002 ***
stateVA -0.00503090 0.00025307 -19.879 < 0.0000000000000002 ***
stateVT -0.00590757 0.00025777 -22.918 < 0.0000000000000002 ***
stateWA -0.00408172 0.00028349 -14.398 < 0.0000000000000002 ***
stateWI -0.00407603 0.00028290 -14.408 < 0.0000000000000002 ***
stateWV -0.00373564 0.00026742 -13.969 < 0.0000000000000002 ***
stateWY -0.00490828 0.00025467 -19.273 < 0.0000000000000002 ***
year 0.00008585 0.00001514 5.669 0.00000007092442572 ***
var 0.00243152 0.00244261 0.995 0.32111
Residual standard error: 0.0002384 on 151 degrees of freedom
Multiple R-squared: 0.989, Adjusted R-squared: 0.9853
F-statistic: 262 on 52 and 151 DF, p-value: < 0.00000000000000022
lm(state_vcrime_rate ~ state + year + mean,
data = state_data %>% filter(countystat == 'income')) %>%
msummary()
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.30803238818 0.04063145024 -7.581 0.00000000000323 ***
stateAL -0.00416643472 0.00037861672 -11.004 < 0.0000000000000002 ***
stateAR -0.00379390332 0.00039419386 -9.624 < 0.0000000000000002 ***
stateAZ -0.00455643977 0.00038257297 -11.910 < 0.0000000000000002 ***
stateCA -0.00361869746 0.00020342279 -17.789 < 0.0000000000000002 ***
stateCO -0.00480949741 0.00023529420 -20.440 < 0.0000000000000002 ***
stateCT -0.00477181893 0.00016045448 -29.739 < 0.0000000000000002 ***
stateDC 0.00747919334 0.00027353978 27.342 < 0.0000000000000002 ***
stateDE -0.00300575797 0.00024859396 -12.091 < 0.0000000000000002 ***
stateFL -0.00391377937 0.00032794047 -11.934 < 0.0000000000000002 ***
stateGA -0.00502341846 0.00039215544 -12.810 < 0.0000000000000002 ***
stateHI -0.00562997717 0.00025814702 -21.809 < 0.0000000000000002 ***
stateIA -0.00529545393 0.00023994099 -22.070 < 0.0000000000000002 ***
stateID -0.00642844887 0.00032842199 -19.574 < 0.0000000000000002 ***
stateIL -0.00439976980 0.00028915377 -15.216 < 0.0000000000000002 ***
stateIN -0.00472026937 0.00031592791 -14.941 < 0.0000000000000002 ***
stateKS -0.00435004386 0.00024152096 -18.011 < 0.0000000000000002 ***
stateKY -0.00668803845 0.00038176090 -17.519 < 0.0000000000000002 ***
stateLA -0.00313738740 0.00032823436 -9.558 < 0.0000000000000002 ***
stateMA -0.00291909976 0.00017110362 -17.060 < 0.0000000000000002 ***
stateMD -0.00296903649 0.00018844457 -15.755 < 0.0000000000000002 ***
stateME -0.00721846172 0.00029767852 -24.249 < 0.0000000000000002 ***
stateMI -0.00424793720 0.00033951924 -12.512 < 0.0000000000000002 ***
stateMN -0.00575253856 0.00024130247 -23.840 < 0.0000000000000002 ***
stateMO -0.00397575572 0.00036342436 -10.940 < 0.0000000000000002 ***
stateMS -0.00619859958 0.00039918729 -15.528 < 0.0000000000000002 ***
stateMT -0.00493053953 0.00027843616 -17.708 < 0.0000000000000002 ***
stateNC -0.00519079872 0.00035092482 -14.792 < 0.0000000000000002 ***
stateND -0.00483040704 0.00017247324 -28.007 < 0.0000000000000002 ***
stateNE -0.00492962454 0.00018754939 -26.284 < 0.0000000000000002 ***
stateNH -0.00568886127 0.00018667213 -30.475 < 0.0000000000000002 ***
stateNJ -0.00469149637 0.00015812475 -29.670 < 0.0000000000000002 ***
stateNM -0.00217797172 0.00033938978 -6.417 0.00000000169371 ***
stateNV -0.00164746026 0.00028636598 -5.753 0.00000004720661 ***
stateNY -0.00426064475 0.00024374648 -17.480 < 0.0000000000000002 ***
stateOH -0.00557217730 0.00031170825 -17.876 < 0.0000000000000002 ***
stateOK -0.00410503339 0.00032108840 -12.785 < 0.0000000000000002 ***
stateOR -0.00590509273 0.00030890806 -19.116 < 0.0000000000000002 ***
statePA -0.00508819295 0.00027392141 -18.575 < 0.0000000000000002 ***
stateRI -0.00494336731 0.00015908400 -31.074 < 0.0000000000000002 ***
stateSC -0.00365682220 0.00037691226 -9.702 < 0.0000000000000002 ***
stateSD -0.00420312439 0.00022655218 -18.553 < 0.0000000000000002 ***
stateTN -0.00251144894 0.00036447525 -6.891 0.00000000014088 ***
stateTX -0.00404450340 0.00028141340 -14.372 < 0.0000000000000002 ***
stateUT -0.00633218074 0.00034044793 -18.600 < 0.0000000000000002 ***
stateVA -0.00626660696 0.00027351357 -22.912 < 0.0000000000000002 ***
stateVT -0.00689741504 0.00023175313 -29.762 < 0.0000000000000002 ***
stateWA -0.00535514155 0.00027329230 -19.595 < 0.0000000000000002 ***
stateWI -0.00533107190 0.00027023299 -19.728 < 0.0000000000000002 ***
stateWV -0.00557482269 0.00038205970 -14.591 < 0.0000000000000002 ***
stateWY -0.00537930721 0.00016895514 -31.839 < 0.0000000000000002 ***
year 0.00015847410 0.00002046534 7.744 0.00000000000130 ***
mean -0.00000006697 0.00000001427 -4.693 0.00000598884176 ***
Residual standard error: 0.0002234 on 151 degrees of freedom
Multiple R-squared: 0.9904, Adjusted R-squared: 0.9871
F-statistic: 298.6 on 52 and 151 DF, p-value: < 0.00000000000000022
state_data %>%
filter(countystat == 'poverty_rate') %>%
select(var) %>%
unique() %>%
ggplot(aes(x = var)) +
geom_density()

# decision trees
rpart(state_vcrime_rate ~ state + year,
data = state_data)
n= 2091
node), split, n, deviance, yval
* denotes terminal node
1) root 2091 0.008022991000 0.003946431
2) state=AL,AR,AZ,CA,CO,CT,DE,FL,GA,HI,IA,ID,IL,IN,KS,KY,LA,MA,MD,ME,MI,MN,MO,MS,MT,NC,ND,NE,NH,NJ,NY,OH,OK,OR,PA,RI,SC,SD,TX,UT,VA,VT,WA,WI,WV,WY 1886 0.002262534000 0.003485893
4) state=CO,CT,HI,IA,ID,KY,ME,MN,MS,MT,ND,NE,NH,NJ,OH,OR,PA,RI,UT,VA,VT,WA,WI,WV,WY 1025 0.000337117100 0.002634185
8) state=CT,ID,KY,ME,MN,NH,RI,UT,VA,VT,WY 451 0.000085119900 0.002139351 *
9) state=CO,HI,IA,MS,MT,ND,NE,NJ,OH,OR,PA,WA,WI,WV 574 0.000054796770 0.003022983 *
5) state=AL,AR,AZ,CA,DE,FL,GA,IL,IN,KS,LA,MA,MD,MI,MO,NC,NY,OK,SC,SD,TX 861 0.000296705500 0.004499832
10) state=AZ,CA,GA,IL,IN,KS,MA,MI,NC,NY,OK,SD,TX 533 0.000064932130 0.004135954 *
11) state=AL,AR,DE,FL,LA,MD,MO,SC 328 0.000046519510 0.005091133 *
3) state=AK,DC,NM,NV,TN 205 0.001680338000 0.008183381
6) state=AK,NM,NV,TN 164 0.000055436340 0.006779060 *
7) state=DC 41 0.000007764723 0.013800670 *
rpart(state_vcrime_rate ~ var,
data = state_data %>% filter(countystat == 'poverty_rate'))
n= 204
node), split, n, deviance, yval
* denotes terminal node
1) root 204 0.000782781900 0.003948090
2) var>=0.0001590567 197 0.000380248900 0.003728483
4) var< 0.001100494 25 0.000020637570 0.002282980 *
5) var>=0.001100494 172 0.000299781700 0.003938586
10) var< 0.003312984 126 0.000180747600 0.003761335 *
11) var>=0.003312984 46 0.000104232200 0.004424099
22) var>=0.004113813 26 0.000039203400 0.003755888 *
23) var< 0.004113813 20 0.000038327790 0.005292773
46) var< 0.003699606 8 0.000001079445 0.004317887 *
47) var>=0.003699606 12 0.000024576320 0.005942696 *
3) var< 0.0001590567 7 0.000125653500 0.010128460 *
rpart(state_vcrime_rate ~ .,
data = state_data)
n= 2091
node), split, n, deviance, yval
* denotes terminal node
1) root 2091 0.008022991000 0.003946431
2) state=AL,AR,AZ,CA,CO,CT,DE,FL,GA,HI,IA,ID,IL,IN,KS,KY,LA,MA,MD,ME,MI,MN,MO,MS,MT,NC,ND,NE,NH,NJ,NY,OH,OK,OR,PA,RI,SC,SD,TX,UT,VA,VT,WA,WI,WV,WY 1886 0.002262534000 0.003485893
4) state=CO,CT,HI,IA,ID,KY,ME,MN,MS,MT,ND,NE,NH,NJ,OH,OR,PA,RI,UT,VA,VT,WA,WI,WV,WY 1025 0.000337117100 0.002634185
8) state=CT,ID,KY,ME,MN,NH,RI,UT,VA,VT,WY 451 0.000085119900 0.002139351 *
9) state=CO,HI,IA,MS,MT,ND,NE,NJ,OH,OR,PA,WA,WI,WV 574 0.000054796770 0.003022983 *
5) state=AL,AR,AZ,CA,DE,FL,GA,IL,IN,KS,LA,MA,MD,MI,MO,NC,NY,OK,SC,SD,TX 861 0.000296705500 0.004499832
10) state=AZ,CA,GA,IL,IN,KS,MA,MI,NC,NY,OK,SD,TX 533 0.000064932130 0.004135954 *
11) state=AL,AR,DE,FL,LA,MD,MO,SC 328 0.000046519510 0.005091133 *
3) state=AK,DC,NM,NV,TN 205 0.001680338000 0.008183381
6) state_avg_income< 62777.5 164 0.000055436340 0.006779060 *
7) state_avg_income>=62777.5 41 0.000007764723 0.013800670 *
rpart(state_vcrime_rate ~ state + var,
data = state_data %>% filter(countystat == 'pop_dens'))
n= 204
node), split, n, deviance, yval
* denotes terminal node
1) root 204 0.000782781900 0.003948090
2) state=AL,AR,AZ,CA,CO,CT,DE,FL,GA,HI,IA,ID,IL,IN,KS,KY,LA,MA,MD,ME,MI,MN,MO,MS,MT,NC,ND,NE,NH,NJ,NY,OH,OK,OR,PA,RI,SC,SD,TX,UT,VA,VT,WA,WI,WV,WY 184 0.000221201600 0.003487186
4) state=CO,CT,HI,IA,ID,KY,ME,MN,MS,MT,ND,NE,NH,NJ,OH,OR,PA,RI,UT,VA,VT,WA,WI,WV,WY 100 0.000033043870 0.002634751
8) state=CT,ID,KY,ME,MN,NH,RI,UT,VA,VT,WY 44 0.000008296347 0.002138552 *
9) state=CO,HI,IA,MS,MT,ND,NE,NJ,OH,OR,PA,WA,WI,WV 56 0.000005402242 0.003024621 *
5) state=AL,AR,AZ,CA,DE,FL,GA,IL,IN,KS,LA,MA,MD,MI,MO,NC,NY,OK,SC,SD,TX 84 0.000028987610 0.004501990
10) state=AZ,CA,GA,IL,IN,KS,MA,MI,NC,NY,OK,SD,TX 52 0.000006301939 0.004137407 *
11) state=AL,AR,DE,FL,LA,MD,MO,SC 32 0.000004541995 0.005094437 *
3) state=AK,DC,NM,NV,TN 20 0.000162886000 0.008188413
6) var>=811.4494 13 0.000004729091 0.006737831 *
7) var< 811.4494 7 0.000080001360 0.010882350 *
plot(as.party(rpart(state_vcrime_rate ~ ., data = state_data)))

plot(as.party(rpart(state_vcrime_rate ~ var + state_avg_income, data = state_data %>% filter(countystat == 'income'))))

state_data_pca_df <- state_data[,c(1:7, 17:25)] %>%
unique()
rownames(state_data_pca_df) <- paste(state_data_pca_df$state, state_data_pca_df$year, sep = '')
state_data_pca <- state_data_pca_df[, -2] %>%
prcomp(scale = TRUE)
-1 * state_data_pca$rotation[, 1:4] %>%
round(3)
PC1 PC2 PC3 PC4
year -0.002 -0.049 0.190 -0.593
n_counties -0.246 0.111 -0.228 0.179
state_total_count -0.419 -0.037 0.120 0.051
state_area -0.088 -0.024 -0.051 -0.037
state_pop_dens 0.068 -0.529 -0.006 0.106
state_avg_income 0.037 -0.333 0.509 0.110
state_p_farm_income 0.076 0.141 -0.177 0.673
state_empl_count -0.417 -0.047 0.138 0.062
state_empl_rate 0.131 -0.468 0.119 0.273
state_poverty_count -0.426 -0.039 0.050 0.034
state_poverty_rate -0.137 -0.057 -0.550 -0.196
violent_crime -0.419 -0.074 0.066 0.014
state_vcrime_rate -0.018 -0.474 -0.245 -0.109
property_crime -0.421 -0.049 0.022 0.047
state_pcrime_rate -0.012 -0.338 -0.449 -0.066
summary(state_data_pca)
Importance of components:
PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8 PC9 PC10 PC11 PC12 PC13 PC14 PC15
Standard deviation 2.3236 1.7514 1.4704 1.0927 1.04345 0.9558 0.6842 0.55525 0.44079 0.34091 0.24546 0.13071 0.08364 0.05586 0.02395
Proportion of Variance 0.3599 0.2045 0.1442 0.0796 0.07259 0.0609 0.0312 0.02055 0.01295 0.00775 0.00402 0.00114 0.00047 0.00021 0.00004
Cumulative Proportion 0.3599 0.5644 0.7086 0.7882 0.86077 0.9217 0.9529 0.97343 0.98638 0.99413 0.99815 0.99929 0.99975 0.99996 1.00000
data.frame(sd = state_data_pca$sdev) %>%
rownames_to_column() %>%
mutate(rowname = parse_number(rowname),
totalVar = sum(state_data_pca$sdev^2),
pve = 100 * sd^2 / totalVar,
cusum = cumsum(pve)) %>%
ggplot(aes(x = rowname, y = pve)) +
geom_line()

data.frame(sd = state_data_pca$sdev) %>%
rownames_to_column() %>%
mutate(rowname = parse_number(rowname),
totalVar = sum(state_data_pca$sdev^2),
pve = 100 * sd^2 / totalVar,
cusum = cumsum(pve)) %>%
ggplot(aes(x = rowname, y = cusum)) +
geom_line()

pca_data <- state_data_pca$x %>%
data.frame() %>%
rownames_to_column() %>%
mutate(year = str_extract(rowname, '\\d+') %>% as.numeric(),
rowname = gsub('\\d{4}', '', rowname))
pca_data %>%
ggplot(aes(x = -PC1, y = -PC2,
colour = year %>% as.factor())) +
geom_text(aes(label = rowname), size = 3)

# averaged values, per year
aggregate(pca_data, by = list(pca_data$rowname), FUN = mean) %>%
ggplot(aes(x = -PC1, y = -PC2)) +
geom_text(aes(label = Group.1), size = 3)
argument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NA

# averaged values, per year
pca_data_alt <- aggregate(pca_data, by = list(pca_data$rowname), FUN = mean)
argument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NAargument is not numeric or logical: returning NA
rownames(pca_data_alt) <- pca_data_alt$Group.1
pca_data_alt <- pca_data_alt[, 3:17]
pca_data_alt %>%
dist() %>%
hclust() %>%
plot(cex = 0.8)

pca_data2 <- state_data_pca$x %>%
data.frame() %>%
rownames_to_column()
pca_data2 %>%
dist() %>%
hclust() %>%
plot(cex = 0.8, labels = pca_data2$rowname)
NAs introduced by coercion

# visualization
df <- aggregate(state_poverty_rate ~ state, data = state_data, mean)
df <- filter(df,
state != "DC")
mycolors_True <- brewer.pal(9, "GnBu")
states <- tolower(rownames(USArrests))
map_50S <- map_data("state")
ggplot(data = df,
aes(fill = state_poverty_rate)) +
labs(x = "Longitude", y = "Latitude", title = "Average Poverty Rate in States") +
geom_map(aes(map_id = states), map = map_50S) +
expand_limits(x = map_50S$long, y = map_50S$lat) +
theme_bw() +
scale_fill_gradientn(name = "Poverty Rate",
colours = mycolors_True,
na.value = "grey")

# change two-letter abbreviation to full state name for merging
abbr2state <- function(abbr){
ab <- tolower(c("AL",
"AK", "AZ", "KS", "UT", "CO", "CT",
"DE", "FL", "GA", "HI", "ID", "IL",
"IN", "IA", "AR", "KY", "LA", "ME",
"MD", "MA", "MI", "MN", "MS", "MO",
"MT", "NE", "NV", "NH", "NJ", "NM",
"NY", "NC", "ND", "OH", "OK", "OR",
"PA", "RI", "SC", "SD", "TN", "TX",
"CA", "VT", "VA", "WA", "WV", "WI",
"WY", "DC"))
st <- c("Alabama",
"Alaska", "Arizona", "Kansas",
"Utah", "Colorado", "Connecticut",
"Delaware", "Florida", "Georgia",
"Hawaii", "Idaho", "Illinois",
"Indiana", "Iowa", "Arkansas",
"Kentucky", "Louisiana", "Maine",
"Maryland", "Massachusetts", "Michigan",
"Minnesota", "Mississippi", "Missouri",
"Montana", "Nebraska", "Nevada",
"New Hampshire", "New Jersey", "New Mexico",
"New York", "North Carolina", "North Dakota",
"Ohio", "Oklahoma", "Oregon",
"Pennsylvania", "Rhode Island", "South Carolina",
"South Dakota", "Tennessee", "Texas",
"California", "Vermont", "Virginia",
"Washington", "West Virginia", "Wisconsin",
"Wyoming", "District of Columbia")
st[match(tolower(abbr), ab)]
}
# visualization
# fixed map
merge(map_data("state"),
aggregate(var ~ state,
data = filter(state_data, countystat == "poverty_rate") %>%
select(year, state, var) %>%
unique(),
FUN = mean) %>%
mutate(state = abbr2state(state) %>% tolower()),
by.x = 'region', by.y = 'state') %>%
ggplot() +
geom_polygon(aes(long, lat,
group = group,
fill = var)) +
scale_fill_gradientn(colours = mycolors_True,
trans = 'log',
name = 'Variance') +
theme_bw() +
labs(x = "Longitude",
y = "Latitude",
title = "Variance of Poverty Rate in Counties, Per State")

# visualization
merge(map_data("state"),
aggregate(var ~ state,
data = filter(state_data, countystat == "pop_dens") %>%
select(year, state, var) %>%
unique(),
FUN = mean) %>%
mutate(state = abbr2state(state) %>% tolower()),
by.x = 'region', by.y = 'state') %>%
ggplot() +
geom_polygon(aes(long, lat,
group = group,
fill = var)) +
scale_fill_gradientn(colours = mycolors_True,
trans = 'log',
name = 'Variance') +
theme_bw() +
labs(x = "Longitude",
y = "Latitude",
title = "Variance of Population Density in Counties, Per State")

aggregate(state_pcrime_rate ~ state, data = state_data, mean) %>%
ggplot(aes(x = state,
y = state_pcrime_rate,
colour = state,
group = state)) +
geom_label(aes(label = state), check_overlap = TRUE)+
labs(x = "State",
y = "Average State Property Crime Rate Per State (including DC)",
title = "Average State Property Crime Rate Per State (including DC)")
Ignoring unknown parameters: check_overlap

df_Farm_Counties <- merge(aggregate(state_p_farm_income ~ state, data = state_data, mean),
aggregate(n_counties ~ state, data = state_data, mean),
by = c('state'))
rownames(df_Farm_Counties) <- df_Farm_Counties$state
set.seed(100)
fit <- kmeans(df_Farm_Counties[, 2:3], 5)
clusplot(df_Farm_Counties,
fit$cluster,
color = TRUE,
shade = TRUE,
labels = 2,
lines = 0,
cex = 0.75,
main = 'K-Means Clustering, Proportion of Farm Income \nand Number of Counties per State')

df_Farm_Poverty <- merge(aggregate(state_p_farm_income ~ state, data = state_data, mean),
aggregate(state_poverty_rate ~ state, data = state_data, mean),
by = c('state'))
rownames(df_Farm_Poverty) <- df_Farm_Poverty$state
set.seed(100)
fit2 <- kmeans(df_Farm_Poverty[, 2:3], 4)
clusplot(df_Farm_Poverty,
fit2$cluster,
color = TRUE,
shade = TRUE,
labels = 2,
lines = 0,
cex = 0.75,
main = 'K-Means Clustering, Proportion of Farm Income and Poverty Rate')

df_Crime_Poverty <- merge(aggregate(state_vcrime_rate ~ state, data = state_data, mean),
aggregate(state_poverty_rate ~ state, data = state_data, mean),
by = c('state'))
rownames(df_Crime_Poverty) <- df_Crime_Poverty$state
set.seed(100)
fit2 <- kmeans(df_Crime_Poverty[, 2:3], 4)
clusplot(df_Crime_Poverty,
fit2$cluster,
color = TRUE,
shade = TRUE,
labels = 2,
lines = 0,
cex = 0.75,
main = 'K-Means Clustering, Proportion of Violent Crime Rate and Poverty Rate')

stopCluster(myCluster)
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CiMgY2xlYW4gdXAgUiBlbnZpcm9ubWVudApybShsaXN0ID0gbHMoKSkKCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShtb3NhaWMpCmxpYnJhcnkocGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHJ2ZXN0KQpsaWJyYXJ5KHJlc2hhcGUyKQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShycGFydCkKbGlicmFyeShwYXJ0eWtpdCkKbGlicmFyeShtY2x1c3QpCmxpYnJhcnkodGliYmxlKQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHZpcmlkaXMpCmxpYnJhcnkoUkNvbG9yQnJld2VyKQpsaWJyYXJ5KG1hcHMpCmxpYnJhcnkobWFwdG9vbHMpCmxpYnJhcnkobWFwZGF0YSkKbGlicmFyeShnZ3RoZW1lcykKbGlicmFyeShjbHVzdGVyKQpsaWJyYXJ5KGZwY2EpCmxpYnJhcnkoZG9QYXJhbGxlbCkKYGBgCgpgYGB7cn0KI3VzaW5nIG11bHRpcGxlIGNvcmVzCm15Q2x1c3RlciA8LSBtYWtlQ2x1c3RlcihkZXRlY3RDb3JlcygpIC0gMSwgdHlwZSA9ICJGT1JLIikKCiMgb3B0aW9ucwojIGRpc3BsYXkgYXMgZGVjaW1hbCwgbm90IHNjaWVudGlmaWMgbm90YXRpb24Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpCgojIGRhdGEgZm9yIDIwMTMgLSAyMDE2CmNvdW50eV9wb3ZlcnR5IDwtIHJlYWQuY3N2KGZpbGUgPSAnY291bnR5X3BvdmVydHlfaGlzdC5jc3YnLCBoZWFkZXIgPSBUUlVFLCBzZXAgPSAnLCcpCmNvdW50eV9wb3ZlcnR5JGdlb19zdW1sZXZlbCA8LSBnc3ViKCdbWzpwdW5jdDpdXVxccycsICcnLCBzdHJfZXh0cmFjdChjb3VudHlfcG92ZXJ0eSRnZW9fbmFtZSwgJ1xcLFxcc1tBLVpdezJ9JykpCmNvdW50eV9wb3ZlcnR5JGdlb19uYW1lIDwtIGdzdWIoJ1xcLFxcc1tBLVpdezJ9JywgJycsIGNvdW50eV9wb3ZlcnR5JGdlb19uYW1lKQpjb3VudHlfcG92ZXJ0eSA8LSBjb3VudHlfcG92ZXJ0eVstM10KCiMgbmFtaW5nIHNjaGVtZToKIyBwWUVBUiA9IG51bWJlciBvZiBwZW9wbGUgaW4gcG92ZXJ0eSwgZm9yIHRoZSBnaXZlbiB5ZWFyCiMgcHJZRUFSID0gcG92ZXJ0eSByYXRlLCBmb3IgdGhlIGdpdmVuIHllYXIKIyBwb3BZRUFSID0gdG90YWwgcG9wdWxhdGlvbiwgZm9yIHRoZSBnaXZlbiB5ZWFyCm5hbWVzKGNvdW50eV9wb3ZlcnR5KSA8LSBjKCdjb3VudHknLCAnc3RhdGUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AyMDEzJywgJ3AyMDE0JywgJ3AyMDE1JywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcjIwMTMnLCAncHIyMDE0JywgJ3ByMjAxNScsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAncHIyMDE2JywgJ3AyMDE2JywgJ3BvcDIwMTMnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BvcDIwMTQnLCAncG9wMjAxNScsICdwb3AyMDE2JykKCmNvdW50eV9wb3ZlcnR5IDwtIGNvdW50eV9wb3ZlcnR5ICU+JSAKICBuYS5vbWl0KCkgJT4lCiAgc2VsZWN0KHNvcnQoY3VycmVudF92YXJzKCkpKQoKIyByZW1vdmUgUHVlcnRvIFJpY28KY291bnR5X3BvdmVydHkgPC0gY291bnR5X3BvdmVydHkgJT4lIAogIGZpbHRlcihzdGF0ZSAhPSAnUFInKQoKY291bnR5X3BvdmVydHkgPC0gY291bnR5X3BvdmVydHkgJT4lIAogIHNlbGVjdChzb3J0KGN1cnJlbnRfdmFycygpKSkKYGBgCgpgYGB7cn0KIyBlY29ub21pYy91bmVtcGxveW1lbnQgZGF0YQojIGh0dHBzOi8vYXBwcy5iZWEuZ292L3JlZ2lvbmFsLwplYyA8LSByZWFkLmNzdignQ0FJTkM0X19BTExfU1RBVEVTXzE5NjlfMjAxNy5jc3YnLCBoZWFkZXIgPSBUUlVFLCBzZXAgPSAnLCcpCmVjIDwtIGVjWywgYygnR2VvRklQUycsICdHZW9OYW1lJywgJ0Rlc2NyaXB0aW9uJywgJ1gyMDEzJywgJ1gyMDE0JywgJ1gyMDE1JywgJ1gyMDE2JyldCmVjJERlc2NyaXB0aW9uIDwtIGdzdWIoJ1tbOnB1bmN0Ol1dJywgJycsIGVjJERlc2NyaXB0aW9uKSAlPiUgCiAgdHJpbXdzKCkKCiMga2VlcCAnUGVyIGNhcGl0YSBwZXJzb25hbCBpbmNvbWUgKGRvbGxhcnMpIDQvJywgJ1RvdGFsIGVtcGxveW1lbnQnLCAnRmFybSBwcm9wcmlldG9ycycgaW5jb21lJywgJ05vbmZhcm0gcHJvcHJpZXRvcnMnIGluY29tZScKIyBjbGVhbiBkYXRhCmVjIDwtIGVjICU+JSAKICBmaWx0ZXIoZWMkRGVzY3JpcHRpb24gPT0gJ1BlciBjYXBpdGEgcGVyc29uYWwgaW5jb21lIGRvbGxhcnMgNCcgfCAKICAgICAgICAgICAgICAgICAgICAgIGVjJERlc2NyaXB0aW9uID09ICdUb3RhbCBlbXBsb3ltZW50JyB8IAogICAgICAgICAgICAgICAgICAgICAgZWMkRGVzY3JpcHRpb24gPT0gJ0Zhcm0gcHJvcHJpZXRvcnMgaW5jb21lJyB8IAogICAgICAgICAgICAgICAgICAgICAgZWMkRGVzY3JpcHRpb24gPT0gJ05vbmZhcm0gcHJvcHJpZXRvcnMgaW5jb21lJykKZWMkRGVzY3JpcHRpb25bZWMkRGVzY3JpcHRpb24gPT0gJ1BlciBjYXBpdGEgcGVyc29uYWwgaW5jb21lIGRvbGxhcnMgNCddIDwtICdpbmNvbWUnCmVjJERlc2NyaXB0aW9uW2VjJERlc2NyaXB0aW9uID09ICdUb3RhbCBlbXBsb3ltZW50J10gPC0gJ2VtcGxfY291bnQnCmVjJERlc2NyaXB0aW9uW2VjJERlc2NyaXB0aW9uID09ICdGYXJtIHByb3ByaWV0b3JzIGluY29tZSddIDwtICdmYXJtX2luY29tZScKZWMkRGVzY3JpcHRpb25bZWMkRGVzY3JpcHRpb24gPT0gJ05vbmZhcm0gcHJvcHJpZXRvcnMgaW5jb21lJ10gPC0gJ25vbmZhcm1faW5jb21lJwoKZWMgPC0gZGNhc3QobWVsdChlYywgCiAgICAgICAgICAgICAgICAgaWQudmFycyA9IGMoJ0dlb0ZJUFMnLCAnR2VvTmFtZScsICdEZXNjcmlwdGlvbicpLCAKICAgICAgICAgICAgICAgICBtZWFzdXJlLnZhcnMgPSBjKCdYMjAxMycsICdYMjAxNCcsICdYMjAxNScsICdYMjAxNicpKSwgCiAgICAgICAgICAgIEdlb0ZJUFMgKyBHZW9OYW1lICsgdmFyaWFibGUgfiBEZXNjcmlwdGlvbikgJT4lIAogIG11dGF0ZSh2YXJpYWJsZSA9IGdzdWIoJ1gnLCAnJywgdmFyaWFibGUpKQoKZWNbLCAxOjJdIDwtIGxhcHBseShlY1ssIDE6Ml0sIGFzLmNoYXJhY3RlcikKZWNbLCBjKDEsIDM6NyldIDwtIGxhcHBseShlY1ssIGMoMSwgMzo3KV0sIGFzLm51bWVyaWMpCmVjJHBfZmFybV9pbmNvbWUgPC0gZWMkZmFybV9pbmNvbWUgLyBlYyRub25mYXJtX2luY29tZQplY1tpcy5uYShlYyldIDwtIDAKCiMgY29tYmluZSBlY29ub21pYyBkYXRhIHdpdGggbGFuZCBhcmVhCmFyZWEgPC0gcmVhZF9leGNlbCgnTE5EMDEueGxzJylbLGMoMiw0KV0KbmFtZXMoYXJlYSkgPC0gYygnR2VvRklQUycsICdhcmVhJykKYXJlYSA8LSBsYXBwbHkoYXJlYSwgYXMubnVtZXJpYykKZWMgPC0gbWVyZ2UoZWMsIGFyZWEsIGJ5ID0gJ0dlb0ZJUFMnKQoKIyBzdGF0ZSBkYXRhCiMjIENPTUJJTkUgV0lUSCAnU1RBVEVfREFUQScgREFUQSBGUkFNRQpzdGF0ZV9lYyA8LSBlY1soZWMkR2VvRklQUyAlJSAxMDAwID09IDApLCBdCnN0YXRlX2VjIDwtIHN0YXRlX2VjICU+JSAKICBmaWx0ZXIoR2VvRklQUyA8IDkwMDAwICYgR2VvRklQUyAhPSAwKQpzdGF0ZV9lYyA8LSBzdWJzZXQoc3RhdGVfZWMsIHNlbGVjdCA9IC1jKEdlb0ZJUFMpKQpuYW1lcyhzdGF0ZV9lYykgPC0gYygnc3RhdGUnLCAneWVhcicsIAogICAgICAgICAgICAgICAgICAgICAnZW1wbF9jb3VudCcsICdmYXJtX2luY29tZScsIAogICAgICAgICAgICAgICAgICAgICAnaW5jb21lJywgJ25vbmZhcm1faW5jb21lJywgCiAgICAgICAgICAgICAgICAgICAgICdwX2Zhcm1faW5jb21lJywgJ2FyZWEnKQpgYGAKCmBgYHtyfQojIGNyZWF0ZSB0YWxsIGRhdGEgc2V0CmNwMSA8LSBnYXRoZXIoY291bnR5X3BvdmVydHlbYygxOjUsIDE0KV0sIHllYXIsIHBvdmVydHlfY291bnQsIHAyMDEzOnAyMDE2LCBmYWN0b3Jfa2V5ID0gVFJVRSkgJT4lIAogIG11dGF0ZSh5ZWFyID0gc3RyX2V4dHJhY3QoeWVhciwgJ1xcZHs0fScpKQpjcDIgPC0gZ2F0aGVyKGNvdW50eV9wb3ZlcnR5W2MoMSwgNjo5LCAxNCldLCB5ZWFyLCB0b3RhbF9jb3VudCwgcG9wMjAxMzpwb3AyMDE2LCBmYWN0b3Jfa2V5ID0gVFJVRSkgJT4lIAogIG11dGF0ZSh5ZWFyID0gc3RyX2V4dHJhY3QoeWVhciwgJ1xcZHs0fScpKQpjcCA8LSBtZXJnZShjcDEsIGNwMiwgYnkgPSBjKCdjb3VudHknLCAnc3RhdGUnLCAneWVhcicpKSAlPiUgCiAgbXV0YXRlKHBvdmVydHlfcmF0ZSA9IHBvdmVydHlfY291bnQgLyB0b3RhbF9jb3VudCwKICAgICAgICAgeWVhciA9IHllYXIgJT4lIGFzLm51bWVyaWMoKSkKCmNwJGNvdW50eSA8LSBnc3ViKCdcXHNDb3VudHknLCAnJywgY3AkY291bnR5KQpjcCRjb3VudHkgPC0gZ3N1YignXFxzUGFyaXNoJywgJycsIGNwJGNvdW50eSkKY3AkY291bnR5IDwtIGdzdWIoJ1xcc2NpdHknLCAnXFxzQ2l0eScsIGNwJGNvdW50eSkKY3AkY291bnR5IDwtIGdzdWIoJ1tbOnB1bmN0Ol1dJywgJycsIGNwJGNvdW50eSkKY3AkY291bnR5IDwtIGNwJGNvdW50eSAlPiUgCiAgdHJpbXdzKCkKCiMgY291bnR5IGRhdGEKY291bnR5X2VjIDwtIGVjWyEoZWMkR2VvRklQUyAlJSAxMDAwID09IDApLCBdCmNvdW50eV9lYyA8LSBzdWJzZXQoY291bnR5X2VjLCBzZWxlY3QgPSAtYyhHZW9GSVBTKSkKY291bnR5X2VjJHN0YXRlIDwtIGdzdWIoJ1tbOnB1bmN0Ol1dXFxzJywgJycsIHN0cl9leHRyYWN0KGNvdW50eV9lYyRHZW9OYW1lLCAnXFwsXFxzW0EtWl17Mn0nKSkKY291bnR5X2VjJEdlb05hbWUgPC0gZ3N1YignXFwsXFxzW0EtWl17Mn0nLCAnJywgY291bnR5X2VjJEdlb05hbWUpCm5hbWVzKGNvdW50eV9lYykgPC0gYygnY291bnR5JywgJ3llYXInLCAnZW1wbF9jb3VudCcsIAogICAgICAgICAgICAgICAgICAgICAgJ2Zhcm1faW5jb21lJywgJ2luY29tZScsICdub25mYXJtX2luY29tZScsIAogICAgICAgICAgICAgICAgICAgICAgJ3BfZmFybV9pbmNvbWUnLCAnYXJlYScsICdzdGF0ZScpCgpjb3VudHlfZWMkY291bnR5IDwtIGdzdWIoJ1tbOnB1bmN0Ol1dJywgJycsIGNvdW50eV9lYyRjb3VudHkpCmNvdW50eV9lYyRjb3VudHkgPC0gZ3N1YignXFxzSW5kZXBlbmRlbnRcXHNDaXR5JywgJ1xcc0NpdHknLCBjb3VudHlfZWMkY291bnR5KQpjb3VudHlfZWMkY291bnR5IDwtIGdzdWIoJ1xcc1N0YXVudG9uXFxzV2F5bmVzYm9ybycsICcnLCBjb3VudHlfZWMkY291bnR5KQpgYGAKCmBgYHtyfQojIG1hbnVhbCBmaXggZm9yIGNvdW50aWVzIHdpdGggYXJlYSA9IDAKIyBzY3JhcGUgYXJlYXMgZnJvbSBXaWtpcGVkaWEsIGFzIENlbnN1cyBkYXRhIHdhcyBpbmFkZXF1YXRlCnplcm9hcmVhIDwtIGNvdW50eV9lY1t3aGljaChjb3VudHlfZWMkYXJlYSA9PSAwKSwgLWMoMjo3KV0gJT4lIAogIHVuaXF1ZSgpCnplcm9hcmVhJHdpa2lfbGluayA8LSBnc3ViKCcgQ2l0eSBhbmQgQm9yb3VnaCcsICcnLCB6ZXJvYXJlYSRjb3VudHkpCnplcm9hcmVhJHdpa2lfbGluayA8LSBnc3ViKCcgTXVuaWNpcGFsaXR5JywgJycsIHplcm9hcmVhJHdpa2lfbGluaykKemVyb2FyZWEkd2lraV9saW5rIDwtIGdzdWIoJ1tBLVpdezJ9JywgJycsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZSgnaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzdWIoJ1xccycsICdfJywgemVyb2FyZWEkd2lraV9saW5rKSwgJyxfJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzdWIoJ0FLJywgJ0FsYXNrYScsIHplcm9hcmVhJHN0YXRlKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzdWIoJ0NPJywgJ0NvbG9yYWRvJywgemVyb2FyZWEkc3RhdGUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwID0gJycpKQoKZm9yKGkgaW4gMTpucm93KHplcm9hcmVhKSkgewogIHplcm9hcmVhJGFyZWFbaV0gPC0gZ3N1YignLCcsICcnLCByZWFkX2h0bWwoemVyb2FyZWEkd2lraV9saW5rW2ldKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWxfbm9kZXMoeHBhdGggPSAnLy90aFtjb250YWlucyguLCAiQXJlYSIpXS8vcGFyZW50Ojp0ci9mb2xsb3dpbmctc2libGluZzo6dHJbMV0vdGQnKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWxfdGV4dCgpICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2V4dHJhY3QoJ1tcXGRcXC4sXSsnKSlbMV0gJT4lIAogIGFzLm51bWVyaWMoKQogIGNvdW50eV9lYyRhcmVhW3doaWNoKGNvdW50eV9lYyRjb3VudHkgPT0gemVyb2FyZWEkY291bnR5W2ldKV0gPC0gemVyb2FyZWEkYXJlYVt3aGljaCh6ZXJvYXJlYSRjb3VudHkgPT0gemVyb2FyZWEkY291bnR5W2ldKV0KfQpgYGAKCmBgYHtyfQpjb3VudHlfZGF0YSA8LSBtZXJnZShjcCwgY291bnR5X2VjLCAKICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCdjb3VudHknLCAnc3RhdGUnLCAneWVhcicpKSAlPiUgCiAgbXV0YXRlKGVtcGxfcmF0ZSA9IGVtcGxfY291bnQgLyB0b3RhbF9jb3VudCwgCiAgICAgICAgIHBvcF9kZW5zID0gdG90YWxfY291bnQgLyBhcmVhKQoKIyAnY291bnR5X2RhdGEnIHRvIHdpZGUKc3QgPC0gbGlzdCgpCmZvciAoaSBpbiAyMDEzOjIwMTYpIHsKICBkZiA8LSBjb3VudHlfZGF0YSAlPiUgCiAgICBmaWx0ZXIoeWVhciA9PSBpKQogIGRmIDwtIGRmWywgLTNdCiAgZGZfbmFtZXMgPC0gbmFtZXMoZGYpCiAgZGZfbmFtZXNbM10gPC0gcGFzdGUoJ3AnLCBpICU+JSBhcy5jaGFyYWN0ZXIoKSwgc2VwID0gJycpCiAgZGZfbmFtZXNbNF0gPC0gcGFzdGUoJ3BvcCcsIGkgJT4lIGFzLmNoYXJhY3RlcigpLCBzZXAgPSAnJykKICBkZl9uYW1lc1s1XSA8LSBwYXN0ZSgncHInLCBpICU+JSBhcy5jaGFyYWN0ZXIoKSwgc2VwID0gJycpCiAgZGZfbmFtZXNbNl0gPC0gcGFzdGUoJ2VjJywgaSAlPiUgYXMuY2hhcmFjdGVyKCksIHNlcCA9ICcnKQogIGRmX25hbWVzWzddIDwtIHBhc3RlKCdmX2luYycsIGkgJT4lIGFzLmNoYXJhY3RlcigpLCBzZXAgPSAnJykKICBkZl9uYW1lc1s4XSA8LSBwYXN0ZSgnaW5jJywgaSAlPiUgYXMuY2hhcmFjdGVyKCksIHNlcCA9ICcnKQogIGRmX25hbWVzWzldIDwtIHBhc3RlKCduZl9pbmMnLCBpICU+JSBhcy5jaGFyYWN0ZXIoKSwgc2VwID0gJycpCiAgZGZfbmFtZXNbMTBdIDwtIHBhc3RlKCdwZl9pbmMnLCBpICU+JSBhcy5jaGFyYWN0ZXIoKSwgc2VwID0gJycpCiAgZGZfbmFtZXNbMTJdIDwtIHBhc3RlKCdlcicsIGkgJT4lIGFzLmNoYXJhY3RlcigpLCBzZXAgPSAnJykKICBkZl9uYW1lc1sxM10gPC0gcGFzdGUoJ3BvcF9kZW5zJywgaSAlPiUgYXMuY2hhcmFjdGVyKCksIHNlcCA9ICcnKQogIG5hbWVzKGRmKSA8LSBkZl9uYW1lcwogIHN0W1tpIC0gMjAxMl1dIDwtIGRmCn0KCmNvdW50eV9kYXRhX3dpZGUgPC0gbWVyZ2Uoc3RbWzFdXSwgc3RbWzJdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCdzdGF0ZScsICdjb3VudHknLCAnYXJlYScpKQpjb3VudHlfZGF0YV93aWRlIDwtIG1lcmdlKGNvdW50eV9kYXRhX3dpZGUsIHN0W1szXV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygnc3RhdGUnLCAnY291bnR5JywgJ2FyZWEnKSkKY291bnR5X2RhdGFfd2lkZSA8LSBtZXJnZShjb3VudHlfZGF0YV93aWRlLCBzdFtbNF1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoJ3N0YXRlJywgJ2NvdW50eScsICdhcmVhJykpCmBgYAoKYGBge3J9CiMgZGF0YSBzZXQgb2YgcG92ZXJ0eSwgYnkgc3RhdGUKc3RhdGVfcG92ZXJ0eSA8LSB0YWJsZShjb3VudHlfZGF0YV93aWRlJHN0YXRlKSAlPiUgCiAgZGF0YS5mcmFtZSgpCm5hbWVzKHN0YXRlX3BvdmVydHkpIDwtIGMoJ3N0YXRlJywgJ25fY291bnRpZXMnKQoKIyA1MSA9IG51bWJlciBvZiBzdGF0ZXMsIGluY2x1ZGluZyBXYXNoaW5ndG9uIEQuQy4KCiMgY3JlYXRlIGEgZGF0YSB0YWJsZSBvZiBzdW1tYXJ5IHN0YXRzIHBlciBzdGF0ZQpzcCA8LSBsaXN0KCkKZm9yKGkgaW4gMTo1MSkgewogIHN0YXRlX3N0YXRzIDwtIGRhdGEuZnJhbWUoc3VtbWFyeShjb3VudHlfZGF0YV93aWRlW3doaWNoKGNvdW50eV9kYXRhX3dpZGUkc3RhdGUgPT0gc3RhdGVfcG92ZXJ0eSRzdGF0ZVtpXSksIF0pKVsxMzoyNTgsIDI6M10gJT4lIAogIG11dGF0ZShzdGF0ID0gZ3N1YignXFxzKlxcOicsICcnLCAKICAgICAgICAgICAgICAgICAgICAgc3RyX2V4dHJhY3QoRnJlcSwgJy4qXFw6JykpLCAKICAgICAgICAgRnJlcSA9IGdzdWIoJzonLCAnJywgCiAgICAgICAgICAgICAgICAgICAgIHN0cl9leHRyYWN0KEZyZXEsICdcXDouKycpKSAlPiUgCiAgICAgICAgICAgYXMubnVtZXJpYygpKSAlPiUgCiAgcmVzaGFwZShpZHZhciA9ICdWYXIyJywgdGltZXZhciA9ICdzdGF0JywgZGlyZWN0aW9uID0gJ3dpZGUnKSAlPiUKICBtdXRhdGUoWWVhciA9IHN0cl9leHRyYWN0KFZhcjIsICdcXGR7NH0nKSwgCiAgICAgICAgIFZhcjIgPSBzdHJfZXh0cmFjdChWYXIyLCAnW2Etel9dezEsN30nKSwgCiAgICAgICAgIHN0YXRlID0gc3RhdGVfcG92ZXJ0eSRzdGF0ZVtpXSkKICBzcFtbaV1dIDwtIHN0YXRlX3N0YXRzCn0KCiMgY2xlYW4gZGF0YSwgcmVuYW1lIHZhcmlhYmxlcyBhbmQgcmVvcmdhbml6ZSBjb2x1bW4gb3JkZXIKc3RhdGVfcG92ZXJ0eSA8LSBtZXJnZShzdGF0ZV9wb3ZlcnR5LCBkby5jYWxsKHJiaW5kLCBzcCksIGJ5ID0gJ3N0YXRlJykgJT4lIAogIHNlbGVjdChzb3J0KGN1cnJlbnRfdmFycygpKSkKc3RhdGVfcG92ZXJ0eSA8LSBzdGF0ZV9wb3ZlcnR5WywgYyg4LCAxMCwgNywgOSwgMTo2KV0Kc3RhdGVfcG92ZXJ0eSRWYXIyW3N0YXRlX3BvdmVydHkkVmFyMiA9PSAncCddIDwtICdwb3ZlcnR5X2NvdW50JwpzdGF0ZV9wb3ZlcnR5JFZhcjJbc3RhdGVfcG92ZXJ0eSRWYXIyID09ICdwciddIDwtICdwb3ZlcnR5X3JhdGUnCnN0YXRlX3BvdmVydHkkVmFyMltzdGF0ZV9wb3ZlcnR5JFZhcjIgPT0gJ3BvcCddIDwtICd0b3RhbF9jb3VudCcKc3RhdGVfcG92ZXJ0eSRWYXIyW3N0YXRlX3BvdmVydHkkVmFyMiA9PSAnZWMnXSA8LSAnZW1wbF9jb3VudCcKc3RhdGVfcG92ZXJ0eSRWYXIyW3N0YXRlX3BvdmVydHkkVmFyMiA9PSAnZl9pbmMnXSA8LSAnZmFybV9pbmNvbWUnCnN0YXRlX3BvdmVydHkkVmFyMltzdGF0ZV9wb3ZlcnR5JFZhcjIgPT0gJ2luYyddIDwtICdpbmNvbWUnCnN0YXRlX3BvdmVydHkkVmFyMltzdGF0ZV9wb3ZlcnR5JFZhcjIgPT0gJ2ZfaW5jJ10gPC0gJ2Zhcm1faW5jb21lJwpzdGF0ZV9wb3ZlcnR5JFZhcjJbc3RhdGVfcG92ZXJ0eSRWYXIyID09ICduZl9pbmMnXSA8LSAnbm9uZmFybV9pbmNvbWUnCnN0YXRlX3BvdmVydHkkVmFyMltzdGF0ZV9wb3ZlcnR5JFZhcjIgPT0gJ3BmX2luYyddIDwtICdwX2Zhcm1faW5jb21lJwpzdGF0ZV9wb3ZlcnR5JFZhcjJbc3RhdGVfcG92ZXJ0eSRWYXIyID09ICdlciddIDwtICdlbXBsX3JhdGUnCnN0YXRlX3BvdmVydHkkVmFyMltzdGF0ZV9wb3ZlcnR5JFZhcjIgPT0gJ2FyZWEnXSA8LSAnYXJlYScKc3RhdGVfcG92ZXJ0eSRWYXIyW3N0YXRlX3BvdmVydHkkVmFyMiA9PSAncG9wX2RlbiddIDwtICdwb3BfZGVucycKbmFtZXMoc3RhdGVfcG92ZXJ0eSkgPC0gYygnc3RhdGUnLCAneWVhcicsICduX2NvdW50aWVzJywgJ2NvdW50eXN0YXQnLCAnMXN0X3F1YW50aWxlJywgJzNyZF9xdWFudGlsZScsICdtYXgnLCAnbWVhbicsICdtZWRpYW4nLCAnbWluaW11bScpCgojIHJlcGxhY2UgTkFzIGZvciAneWVhcicKZm9yKGkgaW4gMTpucm93KHN0YXRlX3BvdmVydHkpKSB7CiAgaWYoc3RhdGVfcG92ZXJ0eSR5ZWFyW2ldICU+JSBpcy5uYSkgewogICAgc3RhdGVfcG92ZXJ0eSR5ZWFyW2ldIDwtIHN0YXRlX3BvdmVydHkkeWVhcltpICsgMV0KICB9Cn0KCiMgY3JlYXRlIHZhcmlhYmxlcyBtZWFzdXJpbmcgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBhbmQgdmFyaWFuY2Ugb2YgY291bnR5IHN0YXRzLCBwZXIgeWVhcgpzdGF0ZV92YXJpYW5jZSA8LSBjKCkKc3RhdGVfc2QgPC0gYygpCmZvcihpIGluIDE6bnJvdyhzdGF0ZV9wb3ZlcnR5KSkgewogIHN0YXRlX3ZhcmlhbmNlW2ldIDwtIGNvdW50eV9kYXRhICU+JSAKICAgIGZpbHRlcihzdGF0ZSA9PSBzdGF0ZV9wb3ZlcnR5JHN0YXRlW2ldICYgeWVhciA9PSBzdGF0ZV9wb3ZlcnR5JHllYXJbaV0pICU+JSAKICAgIHNlbGVjdChzdGF0ZV9wb3ZlcnR5JGNvdW50eXN0YXRbaV0pICU+JSAKICAgIHZhcigpCiAgc3RhdGVfc2RbaV0gPC0gc2FwcGx5KGNvdW50eV9kYXRhICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoc3RhdGUgPT0gc3RhdGVfcG92ZXJ0eSRzdGF0ZVtpXSAmIHllYXIgPT0gc3RhdGVfcG92ZXJ0eSR5ZWFyW2ldKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHN0YXRlX3BvdmVydHkkY291bnR5c3RhdFtpXSksIAogICAgICAgICAgICAgICAgICAgICAgICBzZClbWzFdXVsxXQp9CgpzdGF0ZV9wb3ZlcnR5JHZhciA8LSBzdGF0ZV92YXJpYW5jZQpzdGF0ZV9wb3ZlcnR5JHNkIDwtIHN0YXRlX3NkCnN0YXRlX3BvdmVydHlbaXMubmEoc3RhdGVfcG92ZXJ0eSldIDwtIDAKCiMgbWVyZ2Ugc3RhdGUgc3RhdHMgd2l0aCBzdGF0aXN0aWNzIG9uIHRvdGFsIHN0YXRlIHBvcHVsYXRpb24gKCdzdGF0ZV9lYycpLCB0b3RhbCBzdGF0ZSBwb3ZlcnR5IGNvdW50LCBhbmQgb3ZlcmFsbCBzdGF0ZSBwb3ZlcnR5IHJhdGUgKGFnZ3JlZ2F0aW5nICdjcCcpCiMgY2hhbmdlICdzdGF0ZV9lYycgbmFtZXMgZnJvbSBmdWxsIHdvcmRzIHRvIDItbGV0dGVyIGFiYnJldmlhdGlvbnMKZm9yKGkgaW4gMTpucm93KHN0YXRlX2VjKSkgewogIGlmKHN0YXRlX2VjJHN0YXRlW2ldID09ICdEaXN0cmljdCBvZiBDb2x1bWJpYScpIHsKICAgIHN0YXRlX2VjJHN0YXRlW2ldIDwtICdEQycKICB9IGVsc2UgewogICAgc3RhdGVfZWMkc3RhdGVbaV0gPC0gc3RhdGUuYWJiW2dyZXAoc3RhdGVfZWMkc3RhdGVbaV0sIHN0YXRlLm5hbWUpXQogIH0KfQoKc3RhdGVfZWMgPC0gbWVyZ2Uoc3RhdGVfZWMsIAogICAgICAgICAgICAgICAgICBtZXJnZShhZ2dyZWdhdGUocG92ZXJ0eV9jb3VudCB+IHN0YXRlICsgeWVhciwgY3AsIHN1bSksIAogICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGUodG90YWxfY291bnQgfiBzdGF0ZSArIHllYXIsIGNwLCBzdW0pLCAKICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCdzdGF0ZScsICd5ZWFyJykpLCAKICAgICAgICAgICAgICAgICAgYnkgPSBjKCdzdGF0ZScsICd5ZWFyJykpICU+JSAKICBtdXRhdGUocG92ZXJ0eV9yYXRlID0gcG92ZXJ0eV9jb3VudCAvIHRvdGFsX2NvdW50LCAKICAgICAgICAgZW1wbF9yYXRlID0gZW1wbF9jb3VudCAvIHRvdGFsX2NvdW50KQoKc3RhdGVfZWMgPC0gbWVyZ2Uoc3RhdGVfcG92ZXJ0eSwgc3RhdGVfZWMsIGJ5ID0gYygnc3RhdGUnLCAneWVhcicpKQoKIyByZW5hbWUgc3RhdGUtd2lkZSB2YXJpYWJsZXMgZm9yIGNsYXJpdHkKbmFtZXMoc3RhdGVfZWMpIDwtIGMoJ3N0YXRlJywgJ3llYXInLCAnbl9jb3VudGllcycsIAogICAgICAgICAgICAgICAgICAgICAnY291bnR5c3RhdCcsICcxc3RfcXVhbnRpbGUnLCAnM3JkX3F1YW50aWxlJywgCiAgICAgICAgICAgICAgICAgICAgICdtYXgnLCAnbWVhbicsICdtZWRpYW4nLCAKICAgICAgICAgICAgICAgICAgICAgJ21pbmltdW0nLCAndmFyJywgJ3NkJywgCiAgICAgICAgICAgICAgICAgICAgICdzdGF0ZV9lbXBsX2NvdW50JywgJ3N0YXRlX2Zhcm1faW5jb21lJywgJ3N0YXRlX2F2Z19pbmNvbWUnLCAKICAgICAgICAgICAgICAgICAgICAgJ3N0YXRlX25vbmZhcm1faW5jb21lJywgJ3N0YXRlX3BfZmFybV9pbmNvbWUnLCAnc3RhdGVfYXJlYScsIAogICAgICAgICAgICAgICAgICAgICAnc3RhdGVfcG92ZXJ0eV9jb3VudCcsICdzdGF0ZV90b3RhbF9jb3VudCcsICdzdGF0ZV9wb3ZlcnR5X3JhdGUnLCAKICAgICAgICAgICAgICAgICAgICAgJ3N0YXRlX2VtcGxfcmF0ZScpCmBgYAoKCmBgYHtyfQojIHBlci1zdGF0ZSBjcmltZSBkYXRhLCBtZXJnZSB3aXRoICdzdGF0ZV9kYXRhJwpzdGF0ZV9jcmltZSA8LSByZWFkLmNzdihmaWxlID0gJ2VzdGltYXRlZF9jcmltZXMuY3N2JywgaGVhZGVyID0gVFJVRSwgc2VwID0gJywnKQpzdGF0ZV9kYXRhIDwtIG1lcmdlKHN0YXRlX2VjLCBzdGF0ZV9jcmltZVssIC1jKDIsIDQ6NSwgMTUpXSwgCiAgICAgICAgICAgICAgICAgICAgYnkueCA9IGMoJ3llYXInLCAnc3RhdGUnKSwgYnkueSA9IGMoJ3llYXInLCAnc3RhdGVfYWJicicpKSAlPiUgCiAgbXV0YXRlKHN0YXRlX3ZjcmltZV9yYXRlID0gdmlvbGVudF9jcmltZSAvIHN0YXRlX3RvdGFsX2NvdW50LAogICAgICAgICBzdGF0ZV9wY3JpbWVfcmF0ZSA9IHByb3BlcnR5X2NyaW1lIC8gc3RhdGVfdG90YWxfY291bnQsCiAgICAgICAgIHN0YXRlX3BvcF9kZW5zID0gc3RhdGVfdG90YWxfY291bnQgLyBzdGF0ZV9hcmVhKQpzdGF0ZV9kYXRhIDwtIHN0YXRlX2RhdGFbLCBjKDE6MywgMjAsIDE4LCAzNCwgMTUsIDQ6MTIsIDE3LCAxMywgMjIsIDE5LCAyMSwgMjMsIDMyLCAyOCwgMzMpXQpzdGF0ZV9kYXRhJHllYXIgPC0gc3RhdGVfZGF0YSR5ZWFyICU+JSBhcy5udW1lcmljKCkKCiMgZXhwbGFpbiAnc3RhdGVfZGF0YScgdmFyaWFibGVzIGJlbG93CiMgeWVhcjogMjAxMy0yMDE2CiMgc3RhdGU6IHN0YXRlLCB3aXRoaW4gdGhlIFVuaXRlZCBTdGF0ZXMKIyBuX2NvdW50aWVzOiBudW1iZXIgb2YgY291bnRpZXMgaW4gdGhpcyBzdGF0ZQojIHN0YXRlX3RvdGFsX2NvdW50OiBzdGF0ZSBwb3B1bGF0aW9uCiMgY291bnR5c3RhdDogdHlwZSBvZiBzdGF0aXN0aWMsIG1lYXN1cmVkIHdpdGhpbiBjb3VudGllcyBvZiBlYWNoIHN0YXRlCiMjIGVtcGxfY291bnQ6IG51bWJlciBvZiBlbXBsb3llZCBpbmRpdmlkdWFscyB3b3JraW5nIHBlciBjb3VudHkKIyMgZmFybV9pbmNvbWU6IGFtb3VudCBvZiBpbmNvbWUgZnJvbSBmYXJtaW5nIHBlciBjb3VudHkKIyMgbm9uZmFybV9pbmNvbWU6IGFtb3VudCBvZiBpbmNvbWUgZnJvbSBub24tZmFybWluZyBpbmR1c3RyaWVzIHBlciBjb3VudHkKIyMgcF9mYXJtX2luY29tZTogcmF0aW8gb2YgJ2Zhcm1faW5jb21lJyB0byAnbm9uZmFybV9pbmNvbWUnIHBlciBjb3VudHksIGNhbiBiZSBuZWdhdGl2ZSwgaW5kaWNhdG9yIG9mIGhvdyBydXJhbCBjb3VudGllcyBhcmUKIyMgZW1wbF9yYXRlOiByYXRpbyBvZiBlbXBsb3llZCBpbmRpdmlkdWFscyB3b3JraW5nIHBlciBjb3VudHksIGNhbiBiZSA+MQojIyBwb3ZlcnR5X3JhdGU6IHBlcmNlbnRhZ2Ugb2YgaW5kaXZpZHVhbHMgaW4gcG92ZXJ0eSBwZXIgY291bnR5CiMjIHBvdmVydHlfY291bnQ6IG51bWJlciBvZiBpbmRpdmlkdWFscyBpbiBwb3ZlcnR5IHBlciBjb3VudHkKIyMgdG90YWxfY291bnQ6IHBvcHVsYXRpb24gcGVyIGNvdW50eQojIDFzdF9xdWFudGlsZTpzZDogc3RhdGlzdGljcyBvbiBjb3VudGllcywgcGVyIHN0YXRlIGFuZCB5ZWFyCiMgc3RhdGVfYXZnX2luY29tZTogYXZlcmFnZSBpbmNvbWUgcGVyIGluZGl2aWR1YWwgcGVyIHN0YXRlIGFuZCB5ZWFyCiMgc3RhdGVfcF9mYXJtX2luY29tZTogcmF0aW8gb2YgJ2Zhcm1faW5jb21lJyB0byAnbm9uZmFybV9pbmNvbWUnIHBlciBzdGF0ZSBhbmQgeWVhciwgY2FuIGJlIG5lZ2F0aXZlLCBpbmRpY2F0b3Igb2YgaG93IHJ1cmFsIGNvdW50aWVzIGFyZQojIHN0YXRlX3BvdmVydHlfY291bnQ6IG51bWJlciBvZiBpbmRpdmlkdWFscyBpbiBwb3ZlcnR5IHBlciBzdGF0ZSBhbmQgeWVhcgojIHN0YXRlX3BvdmVydHlfcmF0ZTogcGVyY2VudGFnZSBvZiBpbmRpdmlkdWFscyBpbiBwb3ZlcnR5IHBlciBzdGF0ZSBhbmQgeWVhcgojIHN0YXRlX2VtcGxfY291bnQ6IG51bWJlciBvZiBlbXBsb3llZCBpbmRpdmlkdWFscyB3b3JraW5nIHBlciBzdGF0ZSBhbmQgeWVhcgojIHN0YXRlX2VtcGxfcmF0ZTogcmF0aW8gb2YgZW1wbG95ZWQgaW5kaXZpZHVhbHMgd29ya2luZyBwZXIgc3RhdGUgYW5kIHllYXIKIyB2aW9sZW50X2NyaW1lOiBudW1iZXIgb2YgdmlvbGVudCBjcmltZXMgcGVyIHN0YXRlIGFuZCB5ZWFyCiMgc3RhdGVfdmNyaW1lX3JhdGU6IHJhdGUgb2YgdmlvbGVudCBjcmltZXMgcGVyIHN0YXRlIGFuZCB5ZWFyCiMgcHJvcGVydHlfY3JpbWU6IG51bWJlciBvZiBwcm9wZXJ0eSBjcmltZXMgcGVyIHN0YXRlIGFuZCB5ZWFyCiMgc3RhdGVfcGNyaW1lX3JhdGU6IHJhdGUgb2YgcHJvcGVydHkgY3JpbWVzIHBlciBzdGF0ZSBhbmQgeWVhcgoKIyBzYXZlICdzdGF0ZV9kYXRhJyBhcyAuY3N2IGZpbGUKd3JpdGUuY3N2KHN0YXRlX2RhdGEsIGZpbGUgPSAnc3RhdGVfZGF0YS5jc3YnKQpgYGAKCmBgYHtyfQojIHZhcmlvdXMgcmVncmVzc2lvbnMKbG0oc3RhdGVfdmNyaW1lX3JhdGUgfiBzdGF0ZSArIHllYXIgKyB2YXIsIAogICBkYXRhID0gc3RhdGVfZGF0YSAlPiUgZmlsdGVyKGNvdW50eXN0YXQgPT0gJ3BvdmVydHlfcmF0ZScpKSAlPiUgCiAgbXN1bW1hcnkoKQpsbShzdGF0ZV92Y3JpbWVfcmF0ZSB+IHN0YXRlICsgeWVhciArIHZhciwgCiAgIGRhdGEgPSBzdGF0ZV9kYXRhICU+JSBmaWx0ZXIoY291bnR5c3RhdCA9PSAncG9wX2RlbnMnKSkgJT4lIAogIG1zdW1tYXJ5KCkKbG0oc3RhdGVfdmNyaW1lX3JhdGUgfiBzdGF0ZSArIHllYXIgKyBtZWFuLCAKICAgZGF0YSA9IHN0YXRlX2RhdGEgJT4lIGZpbHRlcihjb3VudHlzdGF0ID09ICdwX2Zhcm1faW5jb21lJykpICU+JSAKICBtc3VtbWFyeSgpCmxtKHN0YXRlX3ZjcmltZV9yYXRlIH4gc3RhdGUgKyB5ZWFyICsgdmFyLCAKICAgZGF0YSA9IHN0YXRlX2RhdGEgJT4lIGZpbHRlcihjb3VudHlzdGF0ID09ICdlbXBsX3JhdGUnKSkgJT4lIAogIG1zdW1tYXJ5KCkKbG0oc3RhdGVfdmNyaW1lX3JhdGUgfiBzdGF0ZSArIHllYXIgKyBtZWFuLCAKICAgZGF0YSA9IHN0YXRlX2RhdGEgJT4lIGZpbHRlcihjb3VudHlzdGF0ID09ICdpbmNvbWUnKSkgJT4lIAogICAgbXN1bW1hcnkoKQpgYGAKCmBgYHtyfQpzdGF0ZV9kYXRhICU+JSAKICBmaWx0ZXIoY291bnR5c3RhdCA9PSAncG92ZXJ0eV9yYXRlJykgJT4lIAogIHNlbGVjdCh2YXIpICU+JSAKICB1bmlxdWUoKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gdmFyKSkgKyAKICBnZW9tX2RlbnNpdHkoKQpgYGAKCmBgYHtyfQojIGRlY2lzaW9uIHRyZWVzCnJwYXJ0KHN0YXRlX3ZjcmltZV9yYXRlIH4gc3RhdGUgKyB5ZWFyLCAKICAgICAgZGF0YSA9IHN0YXRlX2RhdGEpCnJwYXJ0KHN0YXRlX3ZjcmltZV9yYXRlIH4gdmFyLCAKICAgICAgZGF0YSA9IHN0YXRlX2RhdGEgJT4lIGZpbHRlcihjb3VudHlzdGF0ID09ICdwb3ZlcnR5X3JhdGUnKSkKcnBhcnQoc3RhdGVfdmNyaW1lX3JhdGUgfiAuLCAKICAgICAgZGF0YSA9IHN0YXRlX2RhdGEpCnJwYXJ0KHN0YXRlX3ZjcmltZV9yYXRlIH4gc3RhdGUgKyB2YXIsIAogICAgICBkYXRhID0gc3RhdGVfZGF0YSAlPiUgZmlsdGVyKGNvdW50eXN0YXQgPT0gJ3BvcF9kZW5zJykpCmBgYAoKYGBge3J9CnBsb3QoYXMucGFydHkocnBhcnQoc3RhdGVfdmNyaW1lX3JhdGUgfiAuLCBkYXRhID0gc3RhdGVfZGF0YSkpKQpgYGAKCmBgYHtyfQpwbG90KGFzLnBhcnR5KHJwYXJ0KHN0YXRlX3ZjcmltZV9yYXRlIH4gdmFyICsgc3RhdGVfYXZnX2luY29tZSwgZGF0YSA9IHN0YXRlX2RhdGEgJT4lIGZpbHRlcihjb3VudHlzdGF0ID09ICdpbmNvbWUnKSkpKQpgYGAKCmBgYHtyfQpzdGF0ZV9kYXRhX3BjYV9kZiA8LSBzdGF0ZV9kYXRhWyxjKDE6NywgMTc6MjUpXSAlPiUgCiAgdW5pcXVlKCkKcm93bmFtZXMoc3RhdGVfZGF0YV9wY2FfZGYpIDwtIHBhc3RlKHN0YXRlX2RhdGFfcGNhX2RmJHN0YXRlLCBzdGF0ZV9kYXRhX3BjYV9kZiR5ZWFyLCBzZXAgPSAnJykKCnN0YXRlX2RhdGFfcGNhIDwtIHN0YXRlX2RhdGFfcGNhX2RmWywgLTJdICU+JSAKICBwcmNvbXAoc2NhbGUgPSBUUlVFKQotMSAqIHN0YXRlX2RhdGFfcGNhJHJvdGF0aW9uWywgMTo0XSAlPiUgCiAgcm91bmQoMykKYGBgCgpgYGB7cn0Kc3VtbWFyeShzdGF0ZV9kYXRhX3BjYSkKYGBgCgpgYGB7cn0KZGF0YS5mcmFtZShzZCA9IHN0YXRlX2RhdGFfcGNhJHNkZXYpICU+JSAKICByb3duYW1lc190b19jb2x1bW4oKSAlPiUgCiAgbXV0YXRlKHJvd25hbWUgPSBwYXJzZV9udW1iZXIocm93bmFtZSksIAogICAgICAgICB0b3RhbFZhciA9IHN1bShzdGF0ZV9kYXRhX3BjYSRzZGV2XjIpLCAKICAgICAgICAgcHZlID0gMTAwICogc2ReMiAvIHRvdGFsVmFyLCAKICAgICAgICAgY3VzdW0gPSBjdW1zdW0ocHZlKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHJvd25hbWUsIHkgPSBwdmUpKSArIAogIGdlb21fbGluZSgpCmBgYAoKYGBge3J9CmRhdGEuZnJhbWUoc2QgPSBzdGF0ZV9kYXRhX3BjYSRzZGV2KSAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKCkgJT4lIAogIG11dGF0ZShyb3duYW1lID0gcGFyc2VfbnVtYmVyKHJvd25hbWUpLCAKICAgICAgICAgdG90YWxWYXIgPSBzdW0oc3RhdGVfZGF0YV9wY2Ekc2Rldl4yKSwgCiAgICAgICAgIHB2ZSA9IDEwMCAqIHNkXjIgLyB0b3RhbFZhciwgCiAgICAgICAgIGN1c3VtID0gY3Vtc3VtKHB2ZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSByb3duYW1lLCB5ID0gY3VzdW0pKSArIAogIGdlb21fbGluZSgpCmBgYAoKYGBge3J9CnBjYV9kYXRhIDwtIHN0YXRlX2RhdGFfcGNhJHggJT4lIAogIGRhdGEuZnJhbWUoKSAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKCkgJT4lIAogIG11dGF0ZSh5ZWFyID0gc3RyX2V4dHJhY3Qocm93bmFtZSwgJ1xcZCsnKSAlPiUgYXMubnVtZXJpYygpLCAKICAgICAgICAgcm93bmFtZSA9IGdzdWIoJ1xcZHs0fScsICcnLCByb3duYW1lKSkKCnBjYV9kYXRhICU+JSAKICBnZ3Bsb3QoYWVzKHggPSAtUEMxLCB5ID0gLVBDMiwgCiAgICAgICAgICAgICBjb2xvdXIgPSB5ZWFyICU+JSBhcy5mYWN0b3IoKSkpICsgCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvd25hbWUpLCBzaXplID0gMykKYGBgCgpgYGB7cn0KIyBhdmVyYWdlZCB2YWx1ZXMsIHBlciB5ZWFyCmFnZ3JlZ2F0ZShwY2FfZGF0YSwgYnkgPSBsaXN0KHBjYV9kYXRhJHJvd25hbWUpLCBGVU4gPSBtZWFuKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gLVBDMSwgeSA9IC1QQzIpKSArIAogIGdlb21fdGV4dChhZXMobGFiZWwgPSBHcm91cC4xKSwgc2l6ZSA9IDMpCmBgYAoKYGBge3J9CiMgYXZlcmFnZWQgdmFsdWVzLCBwZXIgeWVhcgpwY2FfZGF0YV9hbHQgPC0gYWdncmVnYXRlKHBjYV9kYXRhLCBieSA9IGxpc3QocGNhX2RhdGEkcm93bmFtZSksIEZVTiA9IG1lYW4pCnJvd25hbWVzKHBjYV9kYXRhX2FsdCkgPC0gcGNhX2RhdGFfYWx0JEdyb3VwLjEKcGNhX2RhdGFfYWx0IDwtIHBjYV9kYXRhX2FsdFssIDM6MTddCnBjYV9kYXRhX2FsdCAlPiUgCiAgZGlzdCgpICU+JSAKICBoY2x1c3QoKSAlPiUgCiAgcGxvdChjZXggPSAwLjgpCmBgYAoKYGBge3IgZmlnLndpZHRoID0gMTYsIGZpZy5oZWlnaHQgPSA2fQpwY2FfZGF0YTIgPC0gc3RhdGVfZGF0YV9wY2EkeCAlPiUgCiAgZGF0YS5mcmFtZSgpICU+JSAKICByb3duYW1lc190b19jb2x1bW4oKSAKCnBjYV9kYXRhMiAlPiUgCiAgZGlzdCgpICU+JSAKICBoY2x1c3QoKSAlPiUgCiAgcGxvdChjZXggPSAwLjgsIGxhYmVscyA9IHBjYV9kYXRhMiRyb3duYW1lKQpgYGAKCmBgYHtyfQojIHZpc3VhbGl6YXRpb24KZGYgPC0gYWdncmVnYXRlKHN0YXRlX3BvdmVydHlfcmF0ZSB+IHN0YXRlLCBkYXRhID0gc3RhdGVfZGF0YSwgbWVhbikKZGYgPC0gZmlsdGVyKGRmLCAKICAgICAgICAgICAgIHN0YXRlICE9ICJEQyIpIApteWNvbG9yc19UcnVlIDwtIGJyZXdlci5wYWwoOSwgIkduQnUiKQpzdGF0ZXMgPC0gdG9sb3dlcihyb3duYW1lcyhVU0FycmVzdHMpKQptYXBfNTBTIDwtIG1hcF9kYXRhKCJzdGF0ZSIpCgpnZ3Bsb3QoZGF0YSA9IGRmLAogICAgICAgYWVzKGZpbGwgPSBzdGF0ZV9wb3ZlcnR5X3JhdGUpKSArCiAgbGFicyh4ID0gIkxvbmdpdHVkZSIsIHkgPSAiTGF0aXR1ZGUiLCB0aXRsZSA9ICJBdmVyYWdlIFBvdmVydHkgUmF0ZSBpbiBTdGF0ZXMiKSArCiAgZ2VvbV9tYXAoYWVzKG1hcF9pZCA9IHN0YXRlcyksIG1hcCA9IG1hcF81MFMpICsKICBleHBhbmRfbGltaXRzKHggPSBtYXBfNTBTJGxvbmcsIHkgPSBtYXBfNTBTJGxhdCkgKwogIHRoZW1lX2J3KCkgKyAKICBzY2FsZV9maWxsX2dyYWRpZW50bihuYW1lID0gIlBvdmVydHkgUmF0ZSIsIAogICAgICAgICAgICAgICAgICAgICAgIGNvbG91cnMgPSBteWNvbG9yc19UcnVlLAogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXkiKSAKYGBgCgpgYGB7cn0KIyBjaGFuZ2UgdHdvLWxldHRlciBhYmJyZXZpYXRpb24gdG8gZnVsbCBzdGF0ZSBuYW1lIGZvciBtZXJnaW5nCmFiYnIyc3RhdGUgPC0gZnVuY3Rpb24oYWJicil7CiAgYWIgICAgPC0gdG9sb3dlcihjKCJBTCIsCiAgICAgICAgICAgICAiQUsiLCAiQVoiLCAiS1MiLCAiVVQiLCAiQ08iLCAiQ1QiLAogICAgICAgICAgICAgIkRFIiwgIkZMIiwgIkdBIiwgIkhJIiwgIklEIiwgIklMIiwKICAgICAgICAgICAgICJJTiIsICJJQSIsICJBUiIsICJLWSIsICJMQSIsICJNRSIsCiAgICAgICAgICAgICAiTUQiLCAiTUEiLCAiTUkiLCAiTU4iLCAiTVMiLCAiTU8iLAogICAgICAgICAgICAgIk1UIiwgIk5FIiwgIk5WIiwgIk5IIiwgIk5KIiwgIk5NIiwKICAgICAgICAgICAgICJOWSIsICJOQyIsICJORCIsICJPSCIsICJPSyIsICJPUiIsCiAgICAgICAgICAgICAiUEEiLCAiUkkiLCAiU0MiLCAiU0QiLCAiVE4iLCAiVFgiLAogICAgICAgICAgICAgIkNBIiwgIlZUIiwgIlZBIiwgIldBIiwgIldWIiwgIldJIiwKICAgICAgICAgICAgICJXWSIsICJEQyIpKQogIHN0ICAgIDwtIGMoIkFsYWJhbWEiLAogICAgICAgICAgICAgIkFsYXNrYSIsICJBcml6b25hIiwgIkthbnNhcyIsCiAgICAgICAgICAgICAiVXRhaCIsICJDb2xvcmFkbyIsICJDb25uZWN0aWN1dCIsCiAgICAgICAgICAgICAiRGVsYXdhcmUiLCAiRmxvcmlkYSIsICJHZW9yZ2lhIiwKICAgICAgICAgICAgICJIYXdhaWkiLCAiSWRhaG8iLCAiSWxsaW5vaXMiLAogICAgICAgICAgICAgIkluZGlhbmEiLCAiSW93YSIsICJBcmthbnNhcyIsCiAgICAgICAgICAgICAiS2VudHVja3kiLCAiTG91aXNpYW5hIiwgIk1haW5lIiwKICAgICAgICAgICAgICJNYXJ5bGFuZCIsICJNYXNzYWNodXNldHRzIiwgIk1pY2hpZ2FuIiwKICAgICAgICAgICAgICJNaW5uZXNvdGEiLCAiTWlzc2lzc2lwcGkiLCAiTWlzc291cmkiLAogICAgICAgICAgICAgIk1vbnRhbmEiLCAiTmVicmFza2EiLCAiTmV2YWRhIiwKICAgICAgICAgICAgICJOZXcgSGFtcHNoaXJlIiwgIk5ldyBKZXJzZXkiLCAiTmV3IE1leGljbyIsCiAgICAgICAgICAgICAiTmV3IFlvcmsiLCAiTm9ydGggQ2Fyb2xpbmEiLCAiTm9ydGggRGFrb3RhIiwKICAgICAgICAgICAgICJPaGlvIiwgIk9rbGFob21hIiwgIk9yZWdvbiIsCiAgICAgICAgICAgICAiUGVubnN5bHZhbmlhIiwgIlJob2RlIElzbGFuZCIsICJTb3V0aCBDYXJvbGluYSIsCiAgICAgICAgICAgICAiU291dGggRGFrb3RhIiwgIlRlbm5lc3NlZSIsICJUZXhhcyIsCiAgICAgICAgICAgICAiQ2FsaWZvcm5pYSIsICJWZXJtb250IiwgIlZpcmdpbmlhIiwKICAgICAgICAgICAgICJXYXNoaW5ndG9uIiwgIldlc3QgVmlyZ2luaWEiLCAiV2lzY29uc2luIiwKICAgICAgICAgICAgICJXeW9taW5nIiwgIkRpc3RyaWN0IG9mIENvbHVtYmlhIikKICBzdFttYXRjaCh0b2xvd2VyKGFiYnIpLCBhYildCn0KCiMgdmlzdWFsaXphdGlvbgoKIyBmaXhlZCBtYXAKbWVyZ2UobWFwX2RhdGEoInN0YXRlIiksIAogICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlKHZhciB+IHN0YXRlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZmlsdGVyKHN0YXRlX2RhdGEsIGNvdW50eXN0YXQgPT0gInBvdmVydHlfcmF0ZSIpICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCh5ZWFyLCBzdGF0ZSwgdmFyKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOID0gbWVhbikgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoc3RhdGUgPSBhYmJyMnN0YXRlKHN0YXRlKSAlPiUgdG9sb3dlcigpKSwgCiAgICAgICAgICAgICAgICAgICAgICBieS54ID0gJ3JlZ2lvbicsIGJ5LnkgPSAnc3RhdGUnKSAlPiUgCiAgZ2dwbG90KCkgKyAKICBnZW9tX3BvbHlnb24oYWVzKGxvbmcsIGxhdCwgCiAgICAgICAgICAgICAgICAgICBncm91cCA9IGdyb3VwLCAKICAgICAgICAgICAgICAgICAgIGZpbGwgPSB2YXIpKSArIAogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSBteWNvbG9yc19UcnVlLCAKICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICdsb2cnLCAKICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gJ1ZhcmlhbmNlJykgKyAKICB0aGVtZV9idygpICsgCiAgbGFicyh4ID0gIkxvbmdpdHVkZSIsIAogICAgICAgeSA9ICJMYXRpdHVkZSIsIAogICAgICAgdGl0bGUgPSAiVmFyaWFuY2Ugb2YgUG92ZXJ0eSBSYXRlIGluIENvdW50aWVzLCBQZXIgU3RhdGUiKQpgYGAKCmBgYHtyfQojIHZpc3VhbGl6YXRpb24KCm1lcmdlKG1hcF9kYXRhKCJzdGF0ZSIpLCAKICAgICAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZSh2YXIgfiBzdGF0ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGZpbHRlcihzdGF0ZV9kYXRhLCBjb3VudHlzdGF0ID09ICJwb3BfZGVucyIpICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCh5ZWFyLCBzdGF0ZSwgdmFyKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOID0gbWVhbikgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoc3RhdGUgPSBhYmJyMnN0YXRlKHN0YXRlKSAlPiUgdG9sb3dlcigpKSwgCiAgICAgICAgICAgICAgICAgICAgICBieS54ID0gJ3JlZ2lvbicsIGJ5LnkgPSAnc3RhdGUnKSAlPiUgCiAgZ2dwbG90KCkgKyAKICBnZW9tX3BvbHlnb24oYWVzKGxvbmcsIGxhdCwgCiAgICAgICAgICAgICAgICAgICBncm91cCA9IGdyb3VwLCAKICAgICAgICAgICAgICAgICAgIGZpbGwgPSB2YXIpKSArIAogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSBteWNvbG9yc19UcnVlLCAKICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICdsb2cnLCAKICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gJ1ZhcmlhbmNlJykgKyAKICB0aGVtZV9idygpICsgCiAgbGFicyh4ID0gIkxvbmdpdHVkZSIsIAogICAgICAgeSA9ICJMYXRpdHVkZSIsIAogICAgICAgdGl0bGUgPSAiVmFyaWFuY2Ugb2YgUG9wdWxhdGlvbiBEZW5zaXR5IGluIENvdW50aWVzLCBQZXIgU3RhdGUiKQpgYGAKCmBgYHtyIGZpZy53aWR0aCA9IDE2LCBmaWcuaGVpZ2h0ID0gNn0KYWdncmVnYXRlKHN0YXRlX3BjcmltZV9yYXRlIH4gc3RhdGUsIGRhdGEgPSBzdGF0ZV9kYXRhLCBtZWFuKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gc3RhdGUsIAogICAgICAgICAgICAgeSA9IHN0YXRlX3BjcmltZV9yYXRlLCAKICAgICAgICAgICAgIGNvbG91ciA9IHN0YXRlLCAKICAgICAgICAgICAgIGdyb3VwID0gc3RhdGUpKSArCiAgZ2VvbV9sYWJlbChhZXMobGFiZWwgPSBzdGF0ZSksIGNoZWNrX292ZXJsYXAgPSBUUlVFKSsKICBsYWJzKHggPSAiU3RhdGUiLCAKICAgICAgIHkgPSAiQXZlcmFnZSBTdGF0ZSBQcm9wZXJ0eSBDcmltZSBSYXRlIFBlciBTdGF0ZSAoaW5jbHVkaW5nIERDKSIsIAogICAgICAgdGl0bGUgPSAiQXZlcmFnZSBTdGF0ZSBQcm9wZXJ0eSBDcmltZSBSYXRlIFBlciBTdGF0ZSAoaW5jbHVkaW5nIERDKSIpCmBgYAoKYGBge3J9CmRmX0Zhcm1fQ291bnRpZXMgPC0gbWVyZ2UoYWdncmVnYXRlKHN0YXRlX3BfZmFybV9pbmNvbWUgfiBzdGF0ZSwgZGF0YSA9IHN0YXRlX2RhdGEsIG1lYW4pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGUobl9jb3VudGllcyB+IHN0YXRlLCBkYXRhID0gc3RhdGVfZGF0YSwgbWVhbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygnc3RhdGUnKSkKcm93bmFtZXMoZGZfRmFybV9Db3VudGllcykgPC0gZGZfRmFybV9Db3VudGllcyRzdGF0ZQoKc2V0LnNlZWQoMTAwKQpmaXQgPC0ga21lYW5zKGRmX0Zhcm1fQ291bnRpZXNbLCAyOjNdLCA1KQpjbHVzcGxvdChkZl9GYXJtX0NvdW50aWVzLCAKICAgICAgICAgZml0JGNsdXN0ZXIsIAogICAgICAgICBjb2xvciA9IFRSVUUsIAogICAgICAgICBzaGFkZSA9IFRSVUUsIAogICAgICAgICBsYWJlbHMgPSAyLCAKICAgICAgICAgbGluZXMgPSAwLAogICAgICAgICBjZXggPSAwLjc1LAogICAgICAgICBtYWluID0gJ0stTWVhbnMgQ2x1c3RlcmluZywgUHJvcG9ydGlvbiBvZiBGYXJtIEluY29tZSBcbmFuZCBOdW1iZXIgb2YgQ291bnRpZXMgcGVyIFN0YXRlJykKYGBgCgpgYGB7cn0KZGZfRmFybV9Qb3ZlcnR5IDwtIG1lcmdlKGFnZ3JlZ2F0ZShzdGF0ZV9wX2Zhcm1faW5jb21lIH4gc3RhdGUsIGRhdGEgPSBzdGF0ZV9kYXRhLCBtZWFuKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGUoc3RhdGVfcG92ZXJ0eV9yYXRlIH4gc3RhdGUsIGRhdGEgPSBzdGF0ZV9kYXRhLCBtZWFuKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoJ3N0YXRlJykpCnJvd25hbWVzKGRmX0Zhcm1fUG92ZXJ0eSkgPC0gZGZfRmFybV9Qb3ZlcnR5JHN0YXRlCgpzZXQuc2VlZCgxMDApCmZpdDIgPC0ga21lYW5zKGRmX0Zhcm1fUG92ZXJ0eVssIDI6M10sIDQpCmNsdXNwbG90KGRmX0Zhcm1fUG92ZXJ0eSwgCiAgICAgICAgIGZpdDIkY2x1c3RlciwgCiAgICAgICAgIGNvbG9yID0gVFJVRSwgCiAgICAgICAgIHNoYWRlID0gVFJVRSwgCiAgICAgICAgIGxhYmVscyA9IDIsIAogICAgICAgICBsaW5lcyA9IDAsCiAgICAgICAgIGNleCA9IDAuNzUsCiAgICAgICAgIG1haW4gPSAnSy1NZWFucyBDbHVzdGVyaW5nLCBQcm9wb3J0aW9uIG9mIEZhcm0gSW5jb21lIGFuZCBQb3ZlcnR5IFJhdGUnKQpgYGAKCmBgYHtyfQpkZl9DcmltZV9Qb3ZlcnR5IDwtIG1lcmdlKGFnZ3JlZ2F0ZShzdGF0ZV92Y3JpbWVfcmF0ZSB+IHN0YXRlLCBkYXRhID0gc3RhdGVfZGF0YSwgbWVhbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlKHN0YXRlX3BvdmVydHlfcmF0ZSB+IHN0YXRlLCBkYXRhID0gc3RhdGVfZGF0YSwgbWVhbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCdzdGF0ZScpKQpyb3duYW1lcyhkZl9DcmltZV9Qb3ZlcnR5KSA8LSBkZl9DcmltZV9Qb3ZlcnR5JHN0YXRlCgpzZXQuc2VlZCgxMDApCmZpdDIgPC0ga21lYW5zKGRmX0NyaW1lX1BvdmVydHlbLCAyOjNdLCA0KQpjbHVzcGxvdChkZl9DcmltZV9Qb3ZlcnR5LCAKICAgICAgICAgZml0MiRjbHVzdGVyLCAKICAgICAgICAgY29sb3IgPSBUUlVFLCAKICAgICAgICAgc2hhZGUgPSBUUlVFLCAKICAgICAgICAgbGFiZWxzID0gMiwgCiAgICAgICAgIGxpbmVzID0gMCwKICAgICAgICAgY2V4ID0gMC43NSwKICAgICAgICAgbWFpbiA9ICdLLU1lYW5zIENsdXN0ZXJpbmcsIFByb3BvcnRpb24gb2YgVmlvbGVudCBDcmltZSBSYXRlIGFuZCBQb3ZlcnR5IFJhdGUnKQpgYGAKCmBgYHtyfQpzdG9wQ2x1c3RlcihteUNsdXN0ZXIpCmBgYA==